gpt4 book ai didi

python - Python 生成器中的 GeneratorExit

转载 作者:太空狗 更新时间:2023-10-29 20:33:45 27 4
gpt4 key购买 nike

我写了一个关于 Python 生成器的测试程序。但是我得到了一个意想不到的错误。我不知道如何解释。让我向您展示代码:

def countdown(n):
logging.debug("Counting down")
while n > 0:
try:
yield n
except GeneratorExit:
logging.error("GeneratorExit")
n -= 1


if __name__ == '__main__':
c = countdown(10)
logging.debug("value: %d", c.next())

我认为它应该可以毫无问题地运行。但是输出是:

# ./test.py
[2015/06/16 04:10:49] DEBUG - Counting down
[2015/06/16 04:10:49] DEBUG - value: 10
[2015/06/16 04:10:49] ERROR - GeneratorExit
Exception RuntimeError: 'generator ignored GeneratorExit' in <generator object countdown at 0x7f9934407640> ignored

为什么最后一行有错误。我不知道为什么我触发了 GeneratorExit 异常。有什么我错过的发电机吗?我也将代码输入到交互式 python shell 中,一切正常。怎么会这样?

最佳答案

假设您有以下生成器:

def gen():
with open('important_file') as f:
for line in f:
yield line

然后你下一个它一次然后扔掉:

g = gen()
next(g)
del g

生成器的控制流永远不会离开 with block ,因此文件不会关闭。为防止这种情况,当生成器被垃圾收集时,Python 调用其 close 方法,该方法在生成器最后 yield< 时引发 GeneratorExit 异常编辑。此异常旨在触发任何没有机会运行的 finally block 或上下文管理器 __exit__

当您捕捉到 GeneratorExit 并继续运行时,Python 发现生成器没有正确退出。由于这可能表明资源未正确释放,因此 Python 将其报告为 RuntimeError。

关于python - Python 生成器中的 GeneratorExit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30862196/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com