Python Custom Iterator: Schließen Sie eine Datei auf StopIteration

8

Ich habe eine Iterator-Klasse geschrieben, die eine Datei in ihrem __init__ öffnet.

%Vor%

Wie schließe ich diese Datei automatisch, wenn die Iteration beendet ist?

Komplette Klasse:

%Vor%     
jsj 10.02.2013, 12:53
quelle

2 Antworten

10

Eine bessere Möglichkeit, das Ganze zu schreiben, wäre, die Öffnung und die Iteration an einem Ort zu behalten:

%Vor%

Dies wird warten, bis die Datei geöffnet ist, bis Sie sie wirklich benötigen, und sie wird automatisch geschlossen, wenn Sie fertig sind. Es ist auch weniger Code.

Wenn Sie wirklich in die "Generatoren sind super!" Denkweise:

%Vor%     
Ned Batchelder 10.02.2013, 13:15
quelle
1

Sie müssen es explizit schließen, sobald StopIteration ausgelöst wird. In diesem Fall rufen Sie einfach .close() auf, wenn Sie StopIteration selbst erhöhen.

%Vor%

Da kein anderer Code in Ihrer .next() -Methode ein StopIteration auslösen könnte, reicht dies.

Wenn Sie % next() auf einem anderen Iterator in Ihrem eigenen .next() verwendet haben, müssen Sie StopIteration mit einem except StopIteration: -Handler abfangen und die Ausnahme erneut auslösen.

Nur behandelt den Fall StopIteration . Wenn Sie mit anderen Situationen umgehen wollen (ohne den Iterator zu erschöpfen), müssen Sie diese Situation separat behandeln. Machen Sie Ihre Klasse zu einem Context Manager . könnte dabei helfen. Benutzer Ihres Iterators würden dann das Objekt in einer with -Anweisung verwenden, bevor sie darüber iterieren, und wenn die with -Suite beendet wird, könnte die Datei trotzdem geschlossen werden. Vielleicht möchten Sie Ihren Iterator in diesem Fall auch als erledigt markieren:

%Vor%     
Martijn Pieters 10.02.2013 13:01
quelle

Tags und Links