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)) 只叫一次?在程序的整个生命周期中,手柄是否保持打开状态?如果我们有稀缺的资源被分配到一个发电机组中呢?线程?

我有一个关于生成器和/或python执行模型的问题

假设:

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”来自动关闭句柄。