在下面的代码中,我希望在循环中间的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/

10-12 02:13