[Python-es] Funciones Decoradores

Chema Cortes pych3m4 en gmail.com
Mie Jun 22 09:55:23 CEST 2011


El día 22 de junio de 2011 08:12, Alexis Roda
<alexis.roda.villalonga en gmail.com> escribió:

> Si no me equivoco kwargs solamente tomará valor si llamas a la función con
> argumentos con nombre:

Además tiene dos problemas:

- Altera el nombre y el docstring de la función que decora
- No tiene en cuenta los argumentos por defecto (si los hubiera)

Lo primero se puede comprobar decorando dos veces una función, y se
soluciona usando 'functools.wraps'; para lo segundo, lo más simple es
usar 'inspect.getcallargs'

import funtools
import inspect


from functools import wraps
from inspect import

def log(f):
    @functools.wraps(f)
    def inner(*args,**kwargs):

        #obtener argumentos "reales"
        callargs=inspect.getcallargs(f, *args, **kwargs)

        if sincro_config.NIVEL_REGISTRO == 1:
            archivo_log_ = open(config.LOG_PATH,'a')
            archivo_log_.write('Ejecutando %s
%s\n'%(f.__name__,strftime("%Y-%m-%d  %H:%M:%S", localtime())))
            archivo_log_.close()

        elif sincro_config.NIVEL_REGISTRO==2:
            archivo_log_ = open(config.LOG_PATH,'a')
            archivo_log_.write('Ejecutando %s
%s\n'%(f.__name__,strftime("%Y-%m-%d  %H:%M:%S", localtime())))
            archivo_log_.write('Parametros Recibos: \n')

            ### aquí cambia el bucle
            for name,value in callargs.items():
                archivo_log_.write('Nombre: %s\t\tValor: %s\n'%(name,value))
            archivo_log_.close()

        f(*args,**kwargs)  ##### también faltaba llamar a la función
para que haga su labor

    return inner


Más información sobre la lista de distribución Python-es