在下面的代码中,我预计fileinput.input当我return在循环中间时,python正在释放,因为它超出了范围.但是,当再次调用我的函数fileinput告诉我
raise RuntimeError, "input() already active"
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
def func(inplace):
for line in fileinput.input(sys.argv[1], inplace=inplace):
[..]
if condition:
return True
[..]
if func(False):
func(True)
Run Code Online (Sandbox Code Playgroud)
在使用时我会期望这种行为,yield但在使用return 时不会.
我正在使用Python 2.7.3.
有没有办法强制重置fileinput?
编辑:
fileinput.close()在回来之前打电话有效.为什么没有隐含地完成?
编辑2:感谢@MatsLindh
更换
for line in fileinput.input(sys.argv[1], inplace=inplace):
Run Code Online (Sandbox Code Playgroud)
同
for line in fileinput.FileInput(sys.argv[1], inplace=inplace):
Run Code Online (Sandbox Code Playgroud)
做我想要的,因为它返回一个以定义的方式超出范围的对象.我认为那样fileinput.input()做,但没有.它正在使用全局实例.
这里没有任何内容可以超出范围 - 您正在调用已导入的模块中的函数,并且fileinput是具有全局状态的模块之一,因为将来的调用会映射fileinput到先前进行的input调用。
您应该能够通过使用该类FileInput来解决此问题,该类将在您下次调用时重新创建并与该对象一起func()使用。with
或者 - 正如您所发现的,调用close()它会重置内部模块状态。