Estoy tratando de escribir un administrador de contexto que use otros administradores de contexto, para que los clientes no necesiten saber toda la receta, solo la interfaz que presento. No puedo hacerlo usando @contextmanager
- el código después de la llamada yield
no se ejecuta si se ve interrumpido por una excepción, entonces necesito usar un administrador basado en clases.Escribiendo un administrador de contexto en Python que usa una declaración with
aquí hay un pequeño script de ejemplo:
from contextlib import contextmanager
import pprint
d = {}
@contextmanager
def simple(arg, val):
print "enter", arg
d[arg] = val
yield
print "exit", arg
del d[arg]
class compl(object):
def __init__(self, arg, val):
self.arg=arg
self.val=val
def __enter__(self):
with simple("one",1):
with simple("two",2):
print "enter complex", self.arg
d[self.arg] = self.val
def __exit__(self,*args):
print "exit complex", self.arg
del d[self.arg]
print "before"
print d
print ""
with compl("three",3):
print d
print ""
print "after"
print d
print ""
que da salida a esto:
before
{}
enter one
enter two
enter complex three
exit two
exit one
{'three': 3}
exit complex three
after
{}
quiero que la producción de este:
before
{}
enter one
enter two
enter complex three
{'one': 1, 'three': 3, 'two': 2}
exit complex three
exit two
exit one
after
{}
¿Hay alguna manera de contar una clase administrador de contexto basado en la base para envolver a sí mismo con otros administradores de contexto?
Sería útil especificar la versión de Python. –
Disculpe la pregunta, pero ¿por qué querría hacer esto? Me parece natural que el gestor de contexto basado en clases salga último, una vez que haya limpiado sus dependencias. –
Targeting python 2.7, lo siento –