python生成器主体中打开句柄的使用寿命
我有一个关于生成器和/或python执行模型的问题 假设:python生成器主体中打开句柄的使用寿命,python,generator,Python,Generator,我有一个关于生成器和/或python执行模型的问题 假设: def g(filename): with open(filename) as handle: for line in handle: yield some_trasformation_on(line) 我的主要困惑是:如果 res = g() print(next(res)) 只叫一次?在程序的整个生命周期中,手柄是否保持打开状态?如果我们有稀缺的资源被分配到一个发电机组中呢?线程?
def g(filename):
with open(filename) as handle:
for line in handle:
yield some_trasformation_on(line)
我的主要困惑是:如果
res = g()
print(next(res))
只叫一次?在程序的整个生命周期中,手柄是否保持打开状态?如果我们有稀缺的资源被分配到一个发电机组中呢?线程?数据库句柄
也许我认为生成器就像引擎盖下的函数一样。用编写的代码回答
如上所述,该文件将在程序的整个生命周期内保持打开状态。当您引用res变量时,它会使生成器stackframe保持活动状态,因此获取with语句以关闭该文件的唯一方法是继续调用,直到for循环正常结束
如何清理发电机
设计用于清理发电机的工具在发电机内部提升了一个高度
下面是一些工作代码,以说明如何执行此操作:
def genfunc(filename):
try:
with open(filename) as datafile:
for line in datafile:
yield len(line)
finally:
print('Status: %s' % datafile.closed)
下面是一个示例会话,显示实际发生的关闭操作:
>>> g = genfunc('somefile.txt')
>>> next(g)
23
>>> g.close()
Status: True
如果有一个带有“with”语句的示例就太好了,因为我认为经常鼓励使用“with”来自动关闭句柄。