gpt4 book ai didi

python - 为什么 fileinput.input 对象在超出范围时不会丢失?

转载 作者:太空狗 更新时间:2023-10-30 00:44:20 25 4
gpt4 key购买 nike

在下面的代码中,我希望 python 释放 fileinput.input 当我在我的循环中间 returning 时它正在退出 -范围。然而,当再次调用时,我的函数 fileinput 告诉我

raise RuntimeError, "input() already active"

这是我的代码:

def func(inplace):
for line in fileinput.input(sys.argv[1], inplace=inplace):
[..]
if condition:
return True
[..]

if func(False):
func(True)

我希望在使用 yield 时会出现这种行为,但在使用 return 时不会。

我使用的是 Python 2.7.3。

有什么方法可以强制重置文件输入吗?

编辑:

在返回之前调用 fileinput.close() 时有效。为什么不隐式完成?

编辑 2:感谢@MatsLindh

替换

for line in fileinput.input(sys.argv[1], inplace=inplace):

for line in fileinput.FileInput(sys.argv[1], inplace=inplace):

做我想做的,因为它返回一个以定义的方式超出范围的对象。我假设 fileinput.input() 会那样做,但事实并非如此。它使用的是全局实例。

最佳答案

所以你需要包装fileinput.input()closing “上下文管理器”将**确保*8 .close()当您使用 with ...: 退出 block 时调用:

from contextlib import closing

def func(inplace):
with closing(fileinput.input(sys.argv[1], inplace=inplace)) as finput:
for line in finput:
[..]
if condition:
return True
[..]

在实现协议(protocol)的对象上使用上下文管理器;通常是文件对象之类的,您确保with 退出时执行清理操作 block 。


Garbage collection can occur any time; and there are conditions around when objects are freed adn cleaned up. If you want the file object to be closed when you exit the block use with.

关于python - 为什么 fileinput.input 对象在超出范围时不会丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30934232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com