Problemumgehung für Python 2.4s Rendite, die nicht im Try -Block mit endgültiger Klausel erlaubt sind
-
22-09-2019 - |
Frage
Ich stecke auf Python2.4 fest, also kann ich keine endgültige Klausel mit Generatoren verwenden oder yield
. Gibt es eine Möglichkeit, dies zu umgehen?
Ich kann keine Erwähnungen dafür finden __del__
Und der Versuch, sicherzustellen, dass es innerhalb einer angemessenen Zeit läuft) ist nicht sehr ansprechend.
Lösung
Sie können Code duplizieren, um den endgültigen Block zu vermeiden:
try:
yield 42
finally:
do_something()
Wird:
try:
yield 42
except: # bare except, catches *anything*
do_something()
raise # re-raise same exception
do_something()
(Ich habe dies nicht auf Python 2.4 ausprobiert, Sie müssen sich möglicherweise sys.exc_info anstelle der ansehen wieder aufnehmen Erklärung oben, wie in raise sys.exc_info[0], sys.exc_info[1], sys.exc_info[2]
.)
Andere Tipps
Der einzige Code, der garantiert aufgerufen wird, wenn eine Generatorinstanz einfach aufgegeben wird (Müll gesammelt), sind die __del__
Methoden für seine lokalen Variablen (falls keine Verweise auf diese Objekte außerhalb existieren) und die Rückrufe für schwache Verweise auf seine lokalen Variablen (DITO). Ich empfehle die schwache Referenzroute, da sie nicht invasiv ist (Sie benötigen keine spezielle Klasse mit a __del__
- Nur alles, was schwach referenzierbar ist). Z.B:
import weakref
def gen():
x = set()
def finis(*_):
print 'finis!'
y = weakref.ref(x, finis)
for i in range(99):
yield i
for i in gen():
if i>5: break
Dies druckt finis!
, wie gewünscht.