调用前Python装饰函数
我有一个相当复杂的装饰师,是别人写的。我想做的是根据描述调用函数的修饰版本,或者另一次调用原始函数(未修饰)。这是可能的吗?需要:调用前Python装饰函数,python,decorator,Python,Decorator,我有一个相当复杂的装饰师,是别人写的。我想做的是根据描述调用函数的修饰版本,或者另一次调用原始函数(未修饰)。这是可能的吗?需要: decorator(original_function)() 没有: original_function() 装饰器只是一个函数,它将一个函数作为参数,并返回另一个参数。@语法是完全可选的。也许对其中一些进行筛选有助于澄清问题 def original_function(): pass decorated_function= decorator(ori
decorator(original_function)()
没有:
original_function()
装饰器只是一个函数,它将一个函数作为参数,并返回另一个参数。@语法是完全可选的。也许对其中一些进行筛选有助于澄清问题
def original_function():
pass
decorated_function= decorator(original_function)
if use_decorated:
decorated_function()
else:
original_function()
只装饰一次,然后选择要调用的版本。这是我针对这个问题提出的方法。我还需要保持签名不变,所以我使用了decorator模块,但您可以重新调整以避免这种情况。基本上,诀窍是向函数添加属性。“original”函数是未绑定的,所以您需要传入一个“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)