给出如下内容:
def g(filename):
with open(filename) as handle:
for line in handle:
yield some_trasformation_on(line)
我的主要困惑是:如果处理会发生什么
res = g()
print(next(res))
只被召唤一次?手柄在程序的使用寿命期间是否保持打开状态?如果我们在发电机组中分配了稀缺资源怎么办?主题?数据库处理?
也许我认为发电机就像引擎盖下的功能一样.
最佳答案
用写的代码回答
如上所述,该文件将在程序的生命周期内保持打开状态.虽然你有一个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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。