装饰时保留argspec?

时间:2012-09-24 03:32:14

标签: python

  

可能重复:
  How can I programmatically change the argspec of a function in a python decorator?

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应该返回arg1arg2arg3。我认为我需要对wrapper进行不同的定义,以便不使用*a**k,但我不知道如何。

1 个答案:

答案 0 :(得分:9)

decorator模块可以保留它们:

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)
ArgSpec(args=['arg1', 'arg2', 'arg3'], varargs=None, keywords=None, defaults=(1,))

您可以通过手动将函数中的一些__foo__属性复制到包装函数来获得相同的效果,但无论如何装饰模块都会证明它是可能的并且可能为您提供一个起点。