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

鸭嘴兽

如果函数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中描述的协同例程协议的一部分close方法使PythonGeneratorExit在暂停的地方(在yield语句之后)异常抛出到生成器的代码中由于您没有捕获到该异常(通常不应该捕获),因此它将脱离循环并导致with语句关闭文件。

请注意,如果lookForSpecificLine更复杂,并且有引起异常的风险(可能会在更高级别上捕获该异常),则可能无法快速清除问题。这是因为异常回溯将使函数的堆栈帧保持活动状态,因此不会立即对生成器进行垃圾回收并且不会关闭文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章