Este es el primer ejemplo que encontramos cuando nos enfrentamos con decoradores. Pero no soy capaz de darme cuenta de lo que exactamente me gustaría.Registro de Python usando un decorador
Un simple decorador llamado LOG. Debe funciona de esta manera:
@LOG
def f(a, b=2, *c, **d):
pass
Y el resultado debe ser algo como:
f(1, pippo=4, paperino='luca')
===== Enter f =====
a = 1
b = 2
pippo = 4
paperino = luca
===== Exit f =====
Donde cada argumento que se pasa como parámetro a la función se identifica por su valor.
he descubierto que el problema es más difícil de lo que pensaba, principalmente a causa de las muchas maneras diferentes que puede pasar argumentos a una función (pensar tuplas con * C o diccionarios con ** d).
Intenté una solución pero no estoy seguro de que sea correcta. Es somethink así:
def LOG(fn):
import inspect
varList, _, _, default = inspect.getargspec(fn)
d = {}
if default is not None:
d = dict((varList[-len(default):][i], v) for i, v in enumerate(default))
def f(*argt, **argd):
print ('Enter %s' % fn).center(100, '=')
d.update(dict((varList[i], v) for i, v in enumerate(argt)))
d.update(argd)
for c in d.iteritems():
print '%s = %s' % c
ret = fn(*argt, **argd)
print 'return: %s' % ret
print ('Exit %s' % fn).center(100, '=')
return ret
return f
creo que no es tan fácil como esperaba, pero es raro que no encontré lo que buscaba en Google.
¿Me puede decir si mi solución está bien? ¿O puede sugerir una mejor solución al problema que propuse?
Gracias a todos.
¿Funciona? Si funciona, entonces está bien. Si no es así, entonces tienes un problema. Háganos una pregunta específica sobre ese problema. –
Sí, tienes razón. En realidad, parece funcionar. Pero mientras escribía hay muchas maneras complejas de pasar argumentos a una función de Python: usando tuplas, diccionarios, argumentos predeterminados, ... En realidad, incluso si parece funcionar, no estoy seguro de si las implementaciones correctas funcionarán. en cada caso. – Luca
Al haber sido víctima de esto, ¿esta función, en la forma absolutamente general que describe, es necesaria para continuar desarrollando su aplicación? Parece que el mecanismo de registro ha llamado su atención, y sé por experiencia que puede ser un terrible asesino de productividad. –