Как я могу передать все параметры декоратору? - PullRequest
2 голосов
/ 09 марта 2009

Я пытался отследить выполнение некоторых методов с помощью декоратора. Вот код декоратора:

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 Ответ

6 голосов
/ 09 марта 2009

Эта строка неверна:

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
>>> 

Если вы когда-либо расширяете свой декоратор так, чтобы он также брал аргументы ключевых слов, вам также необходимо расширить их соответствующим образом при передаче, используя **.

...