您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

“可迭代的收益”与“可迭代的收益”

“可迭代的收益”与“可迭代的收益”

唯一的显着区别是,当从可迭代对象内部引发异常时会发生什么。使用return iter()yourFancyNewClass将不会出现在异常回溯中,而将会出现在异常回溯中yield from。在尽可能多的回溯中获得信息通常是一件好事,尽管在某些情况下您可能希望隐藏包装器。

其他差异:

return iter必须iter全局变量中加载名称-这可能很慢(尽管不太可能显着影响性能),并且可能会引起混乱(尽管像这样覆盖全局变量的任何人都应该得到它们)。

使用,yield from您可以yield在之前和之后插入其他表达式(尽管您可以同等使用itertools.chain)。

如前所述,该yield from表单会舍弃任何生成器返回值(即raise StopException(value),您可以通过编写来解决此问题return (yield from iterator)

这是一个比较两种方法的反汇编并显示异常回溯的测试:http ://ideone.com/1YVcSe

使用return iter()

  3           0 LOAD_GLOBAL              0 (iter)
              3 LOAD_FAST                0 (it)
              6 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
              9 RETURN_VALUE
Traceback (most recent call last):
  File "./prog.py", line 12, in test
  File "./prog.py", line 10, in i
RuntimeError

使用return (yield from)

  5           0 LOAD_FAST                0 (it)
              3 GET_ITER
              4 LOAD_CONST               0 (None)
              7 YIELD_FROM
              8 RETURN_VALUE
Traceback (most recent call last):
  File "./prog.py", line 12, in test
  File "./prog.py", line 5, in bar
  File "./prog.py", line 10, in i
RuntimeError
其他 2022/1/1 18:47:43 有496人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶