【发布时间】:2020-05-25 00:20:15
【问题描述】:
我正在阅读关于generator.close() 的python 文档https://docs.python.org/3/reference/expressions.html。
我对文档的翻译是:
##generator.close()
在生成器函数暂停的地方引发GeneratorExit。
- 如果生成器函数正常退出:
1.1 已经关闭,
1.2 或引发GeneratorExit(通过不捕获异常),
close 返回给它的调用者。
-
如果生成器产生一个值,则会引发
RuntimeError。 -
如果生成器引发任何其他异常,则会将其传播给调用者。
如果生成器由于异常或正常退出而已经退出,close() 不执行任何操作。
我不明白close() 行为与文档的对应关系。
>>> def echo(value=None):
... print("Execution starts when 'next()' is called for the first time.")
... try:
... while True:
... try:
... value = (yield value)
... except Exception as e:
... value = e
... finally:
... print("Don't forget to clean up when 'close()' is called.")
...
>>> generator = echo(1)
>>> next(generator)
Execution starts when 'next()' is called for the first time.
>>> generator.close()
Don't forget to clean up when 'close()' is called.
哪条规则适用于 generator.close() ?我很困惑。
我的理解:
-
generator.close()引发GeneratorExit异常 -
GeneratorExit被except Exception as e:捕获并继续循环 -
value = (yield value)执行 - 根据上述规则 2,将引发
RuntimeError。
但似乎并非如此。
请告诉我里面发生了什么。
【问题讨论】: