python生成器主体中打开句柄的寿命

2024-04-16 22:21:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

比如:

def g(filename):
    with open(filename) as handle:
        for line in handle:
            yield some_trasformation_on(line)

我的主要困惑是:如果

res = g()
print(next(res))

只打过一次电话?手柄在程序的生命周期内保持打开状态吗?如果我们有稀缺的资源被分配到一个发电机体内呢?线程?数据库句柄?你知道吗

也许我认为发电机就像引擎盖下的函数。你知道吗


Tags: in模型fordefaswithlineres
1条回答
网友
1楼 · 发布于 2024-04-16 22:21:13

用写的代码回答

如前所述,文件将在程序的生命周期内保持打开状态。当您有一个对res变量的引用时,它会使生成器stackframe保持活动状态,因此获取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

相关问题 更多 >