Solución para el rendimiento pitón de 2,4 no permitido en bloque try con finalmente cláusula

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

Pregunta

Estoy atascado en python2.4, así que no puedo utilizar una cláusula finally con generadores o yield. ¿Hay alguna forma de evitar esto?

No se puede encontrar cualquier mención de cómo evitar esta limitación en Python 2.4, y no soy un gran fan de las soluciones que he pensado (que implica principalmente __del__ y tratando de asegurarse de que funciona dentro de una tiempo razonable) no son muy atractivos.

¿Fue útil?

Solución

Se puede duplicar el código para evitar el bloque finally:

try:
  yield 42
finally:
  do_something()

Se convierte en:

try:
  yield 42
except:  # bare except, catches *anything*
  do_something()
  raise  # re-raise same exception
do_something()

(no he probado esto en Python 2.4, es posible que tenga que mirar sys.exc_info en lugar de la declaración volver a subir por encima, como en raise sys.exc_info[0], sys.exc_info[1], sys.exc_info[2].)

Otros consejos

El único código que está garantizado que se llamará cuando una instancia del generador es simplemente abandonada (recolector de basura) son los métodos __del__ para sus variables locales (si no existen referencias a esos objetos fuera) y las devoluciones de llamada de referencias débiles a sus variables locales (ídem). Recomiendo la ruta referencia débil porque es no invasivo (no se necesita una clase especial con un __del__ - simplemente todo lo que es débilmente referenciable). Por ejemplo:.

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

que esto hace finis! de impresión, según se desee.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top