Problemumgehung für Python 2.4s Rendite, die nicht im Try -Block mit endgültiger Klausel erlaubt sind

StackOverflow https://stackoverflow.com/questions/2339358

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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top