我有关于生成器和/或python的执行模型的问题.
给出如下内容:
def g(filename):
with open(filename) as handle:
for line in handle:
yield some_trasformation_on(line)
Run Code Online (Sandbox Code Playgroud)
我的主要困惑是:如果处理会发生什么
res = g()
print(next(res))
Run Code Online (Sandbox Code Playgroud)
只被召唤一次?手柄在程序的使用寿命期间是否保持打开状态?如果我们在发电机组中分配了稀缺资源怎么办?主题?数据库处理?
也许我认为发电机就像引擎盖下的功能一样.
如上所述,该文件将在程序的生命周期内保持打开状态。 当您引用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)
Run Code Online (Sandbox Code Playgroud)
这是一个示例会话,显示实际发生的关闭操作:
>>> g = genfunc('somefile.txt')
>>> next(g)
23
>>> g.close()
Status: True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |