Estoy tratando de escribir un decorador simple que registra una declaración dada antes de llamar a la función decorada. Las declaraciones registradas deberían parecer que provienen de la misma función, que pensé que era el propósito de functools.wraps().Usando functools.wraps con un decorador de registro
¿Por qué el siguiente código:
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(funcName)20s - %(message)s')
from functools import wraps
def log_and_call(statement):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
logging.info(statement)
return func(*args, **kwargs)
return wrapper
return decorator
@log_and_call("This should be logged by 'decorated_function'")
def decorated_function():
logging.info('I ran')
decorated_function()
dan lugar a estados de registro como:
wrapper - This should be logged by 'decorated_function'
decorated_function - I ran
pensé que la llamada a envolturas renombraría envoltorio con el nombre de decorated_function.
Estoy usando python 2.7.1.
¿Hay alguna manera de hacer lo mismo sin pasar la declaración todo el tiempo? significa que solo quiero usar logger.info ('test {}', 123) en mi código, pero agrega automáticamente un dict adicional. ahora uso tu idea como def log_and_call (statement, level): .... y def test (st, level): @log_and_call() def api(): pass api(). y use como logger.debug ('test {}'. format (123), 'debug'). Está funcionando hay algún método mejor. – Jisson