qué - ¿Cómo funcionan__enter__ y__exit__ en las clases de decoradores de Python?
patron decorator python (1)
El __exit__()
debe aceptar información sobre las excepciones que surgen en el bloque with:
Ver here
La siguiente modificación de tu código funciona:
def __exit__(self, exc_type, exc_value, tb):
if exc_type is not None:
traceback.print_exception(exc_type, exc_value, tb)
# return False # uncomment to pass exception through
return True
Luego, puede intentar generar una excepción en uno de sus bloques with:
y quedará atrapado en __exit__()
.
Estoy tratando de crear una clase decoradora que cuente cuántas veces se llama a una función, pero aparece un mensaje de error que dice:
"TypeError: __exit__() takes exactly 1 argument (4 given)"
y realmente no sé cómo le doy cuatro argumentos. Mi código se ve así:
class fcount2(object):
__instances = {}
def __init__(self, f):
self.__f = f
self.__numcalls = 0
fcount2.__instances[f] = self
def __call__(self, *args, **kwargs):
self.__numcalls += 1
return self.__f(*args, **kwargs)
def __enter__(self):
return self
def __exit__(self):
return self
@staticmethod
def count(f):
return fcount2.__instances[self.__f].__numcalls
@fcount2
def f(n):
return n+2
for n in range(5):
print f(n)
print ''f count ='',f.count
def foo(n):
return n*n
with fcount2(foo) as g:
print g(1)
print g(2)
print ''g count ='',g.count
print ''f count ='',f.count
with fcount2(f) as g:
print g(1)
print g(2)
print ''g count ='',g.count
print ''f count ='',f.count
with f:
print f(1)
print g(2)
print ''g count ='',g.count
print ''f count ='',f.count
¿Hay otros parámetros que debería (o no debería) pasar a la función def exit ? Cualquier consejo o idea sería apreciado.
Además, mi línea de código que dice "print ''f count ='', f.count" parece estar emitiendo la dirección de memoria en lugar del valor, pero ese es un problema completamente diferente.