如何以编程方式更改python装饰器中函数的argspec?

Chr*_*s R 13 python reflection decorator inspect

给定一个功能:

def func(f1, kw='default'):
    pass
bare_argspec = inspect.getargspec(func)

@decorator
def func2(f1, kw='default'):
    pass
decorated_argspec = inspect.getargspec(func2)
Run Code Online (Sandbox Code Playgroud)

我怎样才能创建这样的装饰器bare_argspec == decorated_argspec

(至于为什么,调用装饰函数的框架执行argspec检查以选择要传入的内容,因此装饰器必须保留相同的argspec才能发挥出色.当我在#python上提出这个问题时,我得到了一个长的关于为什么框架糟糕的演讲,这不是我正在寻找的;我必须在这里解决问题.另外,我也只是对答案感兴趣)

unu*_*tbu 12

Michele Simionato的装饰模块有一个名为decorator的装饰器,它保留了函数argspecs.

import inspect
import decorator

def func(f1, kw='default'):
    pass
bare_argspec = inspect.getargspec(func)
print(bare_argspec)
# ArgSpec(args=['f1', 'kw'], varargs=None, keywords=None, defaults=('default',))

@decorator.decorator
def mydecorator(func,*args,**kw):
    result=func(*args,**kw)
    return result

@mydecorator
def func2(f1, kw='default'):
    pass
decorated_argspec = inspect.getargspec(func2)
print(decorated_argspec)
# ArgSpec(args=['f1', 'kw'], varargs=None, keywords=None, defaults=('default',))

assert(bare_argspec==decorated_argspec)
Run Code Online (Sandbox Code Playgroud)