¿Cómo puedo pasar todos los parámetros a un decorador?
Pregunta
Intenté rastrear la ejecución de algunos métodos usando un decorador. Aquí está el código del decorador:
def trace(func):
def ofunc(*args):
func_name = func.__name__
xargs = args
print "entering %s with args %s" % (func_name,xargs)
ret_val = func(args)
print "return value %s" % ret_val
print "exiting %s" % (func_name)
return ofunc
El problema es que, si intento aplicar este decorador a los métodos, el parámetro no se envía. ¿Puedes decirme por qué y cómo puedo solucionarlo?
Solución
Esta línea es incorrecta:
ret_val = func(args)
Te estás olvidando de expandir la lista de argumentos cuando la estás pasando. Debería ser:
ret_val = func(*args)
Salida de muestra con esta modificación en su lugar:
>>> class Test2:
... @trace
... def test3(self, a, b):
... pass
...
>>> t = Test2()
>>> t.test3(1,2)
entering test3 with args (<__main__.Test2 instance at 0x7ff2b42c>, 1, 2)
return value None
exiting test3
>>>
Si alguna vez expandes tu decorador para tomar también argumentos de palabras clave, también deberías expandirlos adecuadamente cuando los pases, usando **
.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow