在下面的代码中,我希望在循环中间的fileinput.input
超出范围时,python将释放return
。但是,当再次调用我的函数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吗?
编辑:
在返回之前调用
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
是具有全局状态的那些模块之一,因为将来对fileinput
的调用会映射到先前进行的input
调用。
您应该能够解决此问题,方法是改为使用FileInput
类,该类将在您下次调用func()
时重新创建,并与该对象一起使用with
。
或-如您所见,调用close()
重置内部模块状态。
关于python - 超出范围时,为什么fileinput.input对象没有丢失?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30934232/