我想用这样的模式装饰一个函数:
def deco(func):
def wrap(*a,**kw):
print "do something"
return func(*a,**kw)
return wrap
问题是如果装饰的函数有这样的原型:
def function(a,b,c): return
在装饰时,原型被varargs破坏,例如,调用函数(1,2,3,4)不会导致异常.这是避免这种情况的方法吗?
如何使用与装饰(func)原型相同的原型定义wrap函数?
有什么概念上的错误吗?
编辑
我的反常想法是在不修改签名的情况下减轻“父方法的调用”.就像是
def __init__(self, something)
super(ClassName, self).__init__(something)
至:
@extended
def __init__(self, something):
...
我正在弄清楚这是否可能,如果这是有道理的.
编辑
正如Alex指出的那样,以下代码不会给出异常:
function(1,2,3,4)
解决方法:
decorator module可帮助您创建保留功能签名的装饰器.
因此,您将在调用函数时获得预期的异常,并且inspect.getargspec将为您提供正确的签名.
它的工作原理是动态构建函数定义并使用exec.不幸的是,没有一种更简单的内置方法可以做到这一点.