Im folgenden Code würde ich erwarten, dass Python fileinput.input
freigibt, wenn ich return
bin in der Mitte meiner Schleife bin, wie es außerhalb des Bereichs geht. Wenn jedoch meine Funktion fileinput mich wieder anrufen sagtWarum wird das fileinput.input-Objekt nicht verloren, wenn es aus dem Geltungsbereich entfernt wird?
raise RuntimeError, "input() already active"
Hier ist mein Code:
def func(inplace):
for line in fileinput.input(sys.argv[1], inplace=inplace):
[..]
if condition:
return True
[..]
if func(False):
func(True)
ich dieses Verhalten erwarten würde, wenn yield
verwenden, aber nicht bei der Verwendung von Rückkehr.
Ich benutze Python 2.7.3.
Gibt es eine Möglichkeit, einen Reset des Fileinputs zu erzwingen?
EDIT:
Beim Aufruf fileinput.close()
, bevor es wieder funktioniert. Warum wird es nicht implizit gemacht?
EDIT 2: Danke
Ersetzen
for line in fileinput.input(sys.argv[1], inplace=inplace):
mit
for line in fileinput.FileInput(sys.argv[1], inplace=inplace):
@MatsLindh tut, was ich will, weil es ein Objekt zurückgibt, die out-of-scope geht in einer definierten Weise. Ich nahm an, dass fileinput.input()
das tut, aber nein. Es verwendet eine globale Instanz.
Warum würden Sie das erwarten? Python garantiert keine Bereinigung am Blockende (es ist nur cpython, das dies normalerweise tut, aber nur, wenn es keine Referenzzyklen gibt). – dhke
Müllsammlung kann jederzeit auftreten; und es gibt Bedingungen, wenn Objekte freigegeben und gereinigt werden. Wenn Sie möchten, dass das Dateiobjekt geschlossen wird, wenn Sie den Block verlassen, verwenden Sie '' '' –
@JamesMills Ich denke, Sie sollten Ihren Kommentar eine Antwort geben. Es scheint so zu sein, IMHO. –