Solución para el rendimiento pitón de 2,4 no permitido en bloque try con finalmente cláusula
-
22-09-2019 - |
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.
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.