gpt4 book ai didi

当调用生成器的 for 循环突然返回时,Python 生成器如何关闭文件句柄?

转载 作者:太空狗 更新时间:2023-10-29 22:13:14 25 4
gpt4 key购买 nike

如果函数 lookForSpecificLine 返回 True(也就是,如果文件“foo.txt”包含 targetLine),Python 如何知道关闭文件句柄?文件“foo.txt”会保持打开状态吗?

def lines(filename):
with open(filename, encoding='utf-8') as file:
for line in file:
yield line

def lookForSpecificLine(targetLine):
for line in lines('foo.txt'):
if targetLine == line:
return True
return False

最佳答案

只要生成器对象还活着,您的文件就会保持打开状态。当生成器被垃圾收集时(通常在 lookForSpecificLine 函数的末尾),Python 将对其调用 close,作为 PEP 342 中描述的协程协议(protocol)的一部分. close 方法导致 Python 将 GeneratorExit 异常抛到生成器代码中暂停的地方(就在 yield 语句之后)。由于您没有捕捉到该异常(通常不应该捕捉到),它将跳出循环并导致 with 语句关闭文件。

请注意,如果 lookForSpecificLine 更复杂并且存在导致异常的风险(会在更高级别捕获),事情可能不会很快得到清理。这是因为异常回溯将使函数的堆栈帧保持事件状态,因此生成器不会立即被垃圾回收,文件也不会关闭。

关于当调用生成器的 for 循环突然返回时,Python 生成器如何关闭文件句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25215908/

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