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% 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.
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: