如果函数lookForSpecificLine
返回True
(也就是说,如果文件食品.txt“包含targetLine
),Python如何知道关闭文件句柄?文件会不会“食品.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
,作为{a1}中描述的协同例程协议的一部分。close
方法使Python在暂停的地方(就在yield
语句之后)向生成器的代码中抛出一个GeneratorExit
异常。由于您没有捕捉到该异常(通常不应该捕捉到),它将跳出循环并导致with
语句关闭文件。在请注意,如果
lookForSpecificLine
更复杂,并且存在导致异常(将在更高级别捕获)的风险,则可能无法快速清理。这是因为异常回溯将使函数的堆栈帧保持活动状态,因此生成器不会立即被垃圾回收,文件也不会关闭。在离开
with
块后,文件将被关闭。有关with
语句的更多信息,请参见PEP343和this guide。在这是因为文件对象也是上下文管理器。基本上,一个类需要定义一个
__enter__
和一个__exit__
函数,这两个函数将分别在with
块的开始和结尾被调用。在下面是一个简单的上下文管理器示例,它在
with
块的开头打印“on enter”,在末尾打印“on exit”:还有一个使用它的例子:
^{pr2}$现在让我们尝试一下,在with语句中引发一个异常:
您可以看到
__exit__
函数中的代码在with
语句的末尾被调用,无论它是正常执行还是引发异常。对于文件对象,它们使用此函数关闭文件句柄并进行清理。在相关问题 更多 >
编程相关推荐