respuesta de Blckknght es grande si usted quiere hacer el registro de entrada cada vez que se llama a la función, pero si tiene una configuración que puede leer una vez y nunca cambia, es posible que no desee verificar la configuración cada vez que se llame a la función decorada. En algunos de nuestros daemons de alto rendimiento en el trabajo, he escrito un decorador que verifica un archivo de configuración una vez cuando el archivo python se carga por primera vez y decide si debe envolverlo o no.
Aquí es una muestra
def timed(f):
def wrapper(*args, **kwargs):
start = datetime.datetime.utcnow()
return_value = f(*args, **kwargs)
end = datetime.datetime.utcnow()
duration = end - start
log_function_call(module=f.__module__, function=f.__name__, start=__start__, end=__end__, duration=duration.total_seconds())
if config.get('RUN_TIMED_FUNCTIONS'):
return wrapper
return f
Suponiendo que log_function_call registra su llamada a una base de datos, archivo de registro, o lo que sea y que config.get ('') RUN_TIMED_FUNCTIONS comprueba la configuración global, a continuación, añadir el decorador @timed a una función comprobará una vez en la carga para ver si está cronometrando en este servidor, entorno, etc. y si no, entonces no cambiará la ejecución de la función en la producción o en otros entornos en los que se preocupe por el rendimiento.
Gracias! La sección de comentarios no formatea, así que agregué el código de muestra a su respuesta original. ¿Pueden explicar por qué no se llama a la función de tiempo? – cfpete
El decorador se aplica en el momento de la importación, por lo que las variables de instancia no se están consultando en ese momento. Tendría que escribir un decorador diferente para eso, uno que se inspecciona a sí mismo cuando lo llama. Fuera del alcance para este formato de Q y comentario. :-) –
¿Cómo lo usaría si quisiera usar esto en métodos basados en clases, es decir, vistas basadas en Django Class? Por allí tenemos que usar 'method_decorator'. ¿Cómo hacer que este código sea compatible con eso? – PythonEnthusiast