8

可能重复:
如何以编程方式更改 python 装饰器中函数的 argspec?

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. 我想我需要以wrapper不同的方式定义不使用*aand **k,但我不知道如何。

4

1 回答 1

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__属性从函数复制到包装函数来获得相同的效果,但无论如何装饰器模块证明了它是可能的,并且可能会给您一个起点。

于 2012-09-24T03:42:53.397 回答