python – 装饰一个函数并添加保留参数数量的功能

我想用这样的模式装饰一个函数:

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.不幸的是,没有一种更简单的内置方法可以做到这一点.

上一篇:c# – 自动实现装饰器方法


下一篇:在Python中的协同程序