Como posso passar todos os parâmetros para um decorador?
Pergunta
Tentei rastrear a execução de alguns métodos usando um decorador. Aqui está o código do 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
O problema é que, se eu tentar aplicar esse decorador aos métodos, o parâmetro próprio não será enviado. Você pode me dizer o porquê e como posso consertar isso?
Solução
Esta linha está incorreta:
ret_val = func(args)
Você está esquecendo de expandir a lista de argumentos quando está passando. Deveria ser:
ret_val = func(*args)
Saída de amostra com esta modificação no local:
>>> 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
>>>
Se você expandir seu decorador para também aceitar argumentos de palavras -chave, também precisará expandi -las adequadamente ao passar em frente, usando **
.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow