son qué patron los hacer funciones ejemplo decoradores decoradoras decorador cuales como python class count decorator exit

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.