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

Pat*_* B. 5 python scope

在下面的代码中,我预计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()做,但没有.它正在使用全局实例.

Mat*_*ndh 2

这里没有任何内容可以超出范围 - 您正在调用已导入的模块中的函数,并且fileinput是具有全局状态的模块之一,因为将来的调用会映射fileinput到先前进行的input调用。

您应该能够通过使用该类FileInput来解决此问题,该类将在您下次调用时重新创建并与该对象一起func()使用。with

或者 - 正如您所发现的,调用close()它会重置内部模块状态。