Python 装饰时是否保留argspec?

Python 装饰时是否保留argspec?,python,Python,可能重复: argspec是获取函数参数的一种很好的方法,但当函数被修饰时,它不起作用: def dec(func): @wraps(func) def wrapper(*a, **k) return func() return wrapper @dec def f(arg1, arg2, arg3=SOME_VALUE): return import inspect print inspect.argspec(f) ----------

可能重复:

argspec是获取函数参数的一种很好的方法,但当函数被修饰时,它不起作用:

def dec(func):
    @wraps(func)
    def wrapper(*a, **k)
        return func()
    return wrapper


@dec
def f(arg1, arg2, arg3=SOME_VALUE):
    return

import inspect
print inspect.argspec(f)

-----------

ArgSpec(args=[], varargs='a', keywords='k', defaults=None)

Argspec应该返回
arg1
arg2
arg3
。我想我需要以不同的方式定义
包装器
,以避免使用
*a
**k
,但我不知道如何使用。

装饰器模块可以很好地保存它们:

from decorator import decorator
@decorator
def dec(func, *a, **k):
    return func()

@dec
def f(arg1, arg2, arg3=1):
    return

import inspect
print inspect.getargspec(f)

通过手动将一些
\uuuufoo\uuuu
属性从函数复制到包装器函数,您可能会获得相同的效果,但无论如何,decorator模块证明了这是可能的,并可能为您提供了一个起点。

这回答了我的问题,但我很遗憾decorator模块似乎不支持接受参数的decorator。你的意思是像decorator“工厂”,像
@dec(1,2)
?很容易做到:只需定义一个接受一些参数的工厂函数,用
@decorator
定义一个内部函数,然后返回内部函数。这是令人困惑的,因为更深一层,它开始看起来类似于functools版本,但它有正确的argspec,应该完全按照您的要求工作。我很高兴有第三方模块解决了我们的问题,所以感谢@MuMind指出这一点,但是为什么Python标准库的
functools.wrapps
decorator不能像您和我所期望的那样处理这个问题呢?毕竟,这正是它的目的。Bug报告?对于那些感兴趣的人,我在这里打开了蠕虫罐头:
ArgSpec(args=['arg1', 'arg2', 'arg3'], varargs=None, keywords=None, defaults=(1,))