Как я могу передать все параметры декоратору?
Я попытался отследить выполнение некоторых методов с помощью декоратора. Вот код декоратора:
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
Дело в том, что если я пытаюсь применить этот декоратор к методам, параметр self не отправляется. Можете ли вы сказать мне, почему и как я могу это исправить?
1 ответ
Решение
Эта строка неверна:
ret_val = func(args)
Вы забываете расширять список аргументов, когда передаете его. Так должно быть:
ret_val = func(*args)
Пример вывода с этой модификацией на месте:
>>> 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
>>>
Если вы когда-либо расширяете свой декоратор так, чтобы он также брал аргументы ключевых слов, вам также нужно было бы расширить их соответствующим образом при передаче, используя **
,