当前位置:  开发笔记 > 编程语言 > 正文

如何将所有参数传递给装饰器?

如何解决《如何将所有参数传递给装饰器?》经验,为你挑选了1个好方法。

我试图使用装饰器跟踪一些方法的执行.这是装饰器代码:

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> Jonny Buchan..:

这行不正确:

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

如果你曾经扩展你的装饰器也采取关键字参数,你还需要在使用时传递它们**.

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有