我有一个由别人编写的相当复杂的装饰器。我想要做的是根据一个决定调用一次函数的装饰版本,或者再次调用原始函数(未装饰)。这可能吗?调用之前的Python装饰函数
9
A
回答
26
随着:
decorator(original_function)()
无:
original_function()
装饰器仅仅是一个函数,它接受一个函数作为参数并返回另一个。 @语法完全是可选的。也许筛选一些documentation可能有助于澄清事情。
2
def original_function():
pass
decorated_function= decorator(original_function)
if use_decorated:
decorated_function()
else:
original_function()
只装饰一次,然后选择要调用的版本。
1
这里是我提出的问题的食谱。我还需要保持签名相同,所以我使用了装饰模块,但是您可以重新夹紧以避免这种情况。基本上,诀窍是给函数添加一个属性。 '原始'函数没有绑定,所以你需要传入一个'self'作为第一个参数,所以我添加了一些额外的代码来检查。
# http://www.phyast.pitt.edu/~micheles/python/decorator-2.0.1.zip
from decorator import decorator, update_wrapper
class mustbe : pass
def wrapper (interface_) :
print "inside hhh"
def call (func, self, *args, **kwargs) :
print "decorated"
print "calling %s.%s with args %s, %s" % (self, func.__name__, args, kwargs)
return interface_ (self, *args, **kwargs)
def original (instance , *args, **kwargs) :
if not isinstance (instance, mustbe) :
raise TypeError, "Only use this decorator on children of mustbe"
return interface_ (instance, *args, **kwargs)
call = decorator (call, interface_)
call.original = update_wrapper (original, call)
return call
class CCC (mustbe):
var = "class var"
@wrapper
def foo (self, param) :
"""foo"""
print self.var, param
class SSS (CCC) :
@wrapper (hidden_=True)
def bar (self, a, b, c) :
print a, b, c
if __name__ == "__main__" :
from inspect import getargspec
print ">>> i=CCC()"
i=CCC()
print ">>> i.var = 'parrot'"
i.var = 'parrot'
print ">>> i.foo.__doc__"
print i.foo.__doc__
print ">>> getargspec(i.foo)"
print getargspec(i.foo)
print ">>> i.foo(99)"
i.foo(99)
print ">>> i.foo.original.__doc__"
print i.foo.original.__doc__
print ">>> getargspec(i.foo.original)"
print getargspec(i.foo.original)
print ">>> i.foo.original(i,42)"
i.foo.original(i,42)
print ">>> j=SSS()"
j=SSS()
print ">>> j.bar(1,2,3)"
j.bar(1,2,3)
相关问题
- 1. Python装饰器在它装饰的函数被调用之前运行?
- 2. Python装饰器,检查函数是否被调用之前
- 3. Python装饰器计数函数调用
- 4. 调用装饰的外部函数
- 5. Python装饰器处理装饰函数的默认参数
- 6. 与函数参数的Python装饰
- 7. 修饰器不调用封装函数
- 8. Python装饰3.0和装饰的参数
- 9. python装饰器和包装函数调试
- 10. 装饰Python的内建print()函数
- 11. 是Python中的装饰器,就像调用函数上的函数一样?
- 12. Python函数修饰器调用
- 13. python装饰器,嵌套函数
- 14. Python装饰器vs传递函数
- 15. 如何测试Python函数装饰器?
- 16. Python:使用相同的装饰器来装饰__call__和普通函数?
- 17. Python的 - 装饰
- 18. python装饰器,调用延迟功能
- 19. python unittest:不能调用装饰测试
- 20. 在引用错误出现之前调用的Python函数?
- 21. 之前调用的事件函数安装程序
- 22. @函数调用之前的字符
- 23. Python函数和装饰器中的括号(包装)
- 24. 从robotframework脚本调用装饰的python函数导致无限递归
- 25. 在调用下载函数之前调用ajax函数
- 26. 为什么python装饰器函数嵌套一个函数?
- 27. 检查一个Python函数是否用特定的修饰器装饰
- 28. 我们可以在函数调用时应用python装饰器吗?
- 29. 安装程序在构造函数之前调用
- 30. 在Python装饰
链接损坏:( – 2015-09-19 14:48:01