在python发生器体中打开手柄的寿命

时间:2016-01-07 03:06:32

标签: 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))

只被调用一次?手柄在程序的使用寿命期间是否保持打开状态?如果我们在发电机组中分配了稀缺资源怎么办?主题?数据库处理?

也许我认为发电机就像功能一样。

1 个答案:

答案 0 :(得分:3)

回答编写的代码

如上所述,该文件将在程序生命周期内保持打开状态。虽然您引用了 res 变量,但它会使生成器堆栈帧保持活动状态,因此,获取with语句以关闭文件的唯一方法是继续调用next(),直到for循环正常结束。

如何清理发电机

为发电机清理而设计的工具是generator.close(),它在发电机内部引发GeneratorExit

以下是一些工作代码,说明如何完成:

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