文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python 3.3 为改进代码中的异常处理所做的工作

2024-12-03 03:50

关注

探索异常处理和其他未被充分利用但仍然有用的 Python 特性。

这是 Python 3.x 首发特性系列文章的第四篇。Python 3.3 于 2012 年首次发布,尽管它已经发布了很长时间,但它引入的许多特性都没有得到充分利用,而且相当酷。下面是其中的三个。

yield from

yield 关键字使 Python 更加强大。可以预见的是,人们都开始使用它来创建整个迭代器的生态系统。itertools 模块和 more-itertools PyPI 包就是其中两个例子。

有时,一个新的生成器会想要使用一个现有的生成器。作为一个简单的(尽管有点故意设计)的例子,设想你想枚举所有的自然数对。

一种方法是按照“自然数对的和,自然数对的第一项”的顺序生成所有的自然数对。用 yield from 来实现这个方法是很自然的。

yield from  关键字是以下的简称:

  1. for item in x:
  2.     yield item
  1. import itertools
  2.  
  3. def pairs():
  4. for n in itertools.count():
  5. yield from ((i, n-i) for i in range(n+1))
  1. list(itertools.islice(pairs(), 6))
  1. [(0, 0), (0, 1), (1, 0), (0, 2), (1, 1), (2, 0)]

隐式命名空间包

假设有一个叫 Parasol 的虚构公司,它制造了一堆东西。它的大部分内部软件都是用 Python 编写的。虽然 Parasol 已经开源了它的一些代码,但其中一些代码对于开源来说过于专有或专业。

该公司使用内部 DevPI 服务器来管理内部软件包。对于 Parasol 的每个 Python 程序员来说,在 PyPI 上找一个未使用的名字是没有意义的,所以所有的内部包都被称为 parasol..。遵守最佳实践,开发人员希望包的名字能反映出这个命名系统。

这一点很重要!如果 parasol.accounting.numeric_tricks 包安装了一个名为 numeric_tricks 的顶层模块,这意味着依赖这个包的人将无法使用名为 numeric_tricks 的 PyPI 包,不管它写的有多好。

然而,这给开发者留下了一个两难的选择:哪个包拥有 parasol/__init__.py 文件?从 Python 3.3 开始,最好的解决办法是把 parasol,可能还有 parasol.accounting,变成没有 __init__.py 文件的 命名空间包

抑制异常的上下文

有时,在从异常中恢复的过程中出现的异常是一个问题,有上下文来跟踪它是很有用的。然而,有时却不是这样:异常已经被处理了,而新的情况是一个不同的错误状况。

例如,想象一下,在字典中查找一个键失败后,如果不能分析它,则希望失败并返回 ValueError()

  1. import time
  2.  
  3. def expensive_analysis(data):
  4.     time.sleep(10)
  5.     if data[0:1] == ">":
  6.         return data[1:]
  7.     return None

这个函数需要很长的时间,所以当你使用它时,想要对结果进行缓存:

  1. cache = {}
  2.  
  3. def last_letter_analyzed(data):
  4.     try:
  5.         analyzed = cache[data]
  6.     except KeyError:
  7.         analyzed = expensive_analysis(data)
  8.         if analyzed is None:
  9.             raise ValueError("invalid data", data)
  10.         cached[data] = analyzed
  11.     return analyzed[-1]

不幸的是,当出现缓存没有命中时,回溯看起来很难看:

  1. last_letter_analyzed("stuff")
  1. ---------------------------------------------------------------------------
  2.  
  3. KeyError Traceback (most recent call last)
  4.  
  5. <ipython-input-16-a525ae35267b> in last_letter_analyzed(data)
  6. 4 try:
  7. ----> 5 analyzed = cache[data]
  8. 6 except KeyError:
  9.  
  10.  
  11. KeyError: 'stuff'

在处理上述异常的过程中,发生了另一个异常:

  1. ValueError Traceback (most recent call last)
  2.  
  3. <ipython-input-17-40dab921f9a9> in <module>
  4. ----> 1 last_letter_analyzed("stuff")
  5.  
  6. <ipython-input-16-a525ae35267b> in last_letter_analyzed(data)
  7. 7 analyzed = expensive_analysis(data)
  8. 8 if analyzed is None:
  9. ----> 9 raise ValueError("invalid data", data)
  10. 10 cached[data] = analyzed
  11. 11 return analyzed[-1]
  12.  
  13.  
  14. ValueError: ('invalid data', 'stuff')

如果你使用 raise ... from None,你可以得到更多可读的回溯:

  1. def last_letter_analyzed(data):
  2. try:
  3. analyzed = cache[data]
  4. except KeyError:
  5. analyzed = expensive_analysis(data)
  6. if analyzed is None:
  7. raise ValueError("invalid data", data) from None
  8. cached[data] = analyzed
  9. return analyzed[-1]
  1. last_letter_analyzed("stuff")
  1. ---------------------------------------------------------------------------
  2.  
  3. ValueError Traceback (most recent call last)
  4.  
  5. <ipython-input-21-40dab921f9a9> in <module>
  6. ----> 1 last_letter_analyzed("stuff")
  7.  
  8. <ipython-input-20-5691e33edfbc> in last_letter_analyzed(data)
  9. 5 analyzed = expensive_analysis(data)
  10. 6 if analyzed is None:
  11. ----> 7 raise ValueError("invalid data", data) from None
  12. 8 cached[data] = analyzed
  13. 9 return analyzed[-1]
  14.  
  15.  
  16. ValueError: ('invalid data', 'stuff')

欢迎来到 2012 年

尽管 Python 3.3 在十年前就已经发布了,但它的许多功能仍然很酷,而且没有得到充分利用。如果你还没有,就把它们添加到你的工具箱中吧。 

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯