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

如何在python装饰器中以编程方式更改函数的argspec?,python,reflection,decorator,inspect,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) 如何创建装饰器,使其bare\u argspec==装饰的\u argspec (至于为什么,调用修饰函数的框架会进行argspec检查

给定一个函数:

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

@decorator
def func2(f1, kw='default'):
    pass
decorated_argspec = inspect.getargspec(func2)
如何创建装饰器,使其
bare\u argspec==装饰的\u argspec


(至于为什么,调用修饰函数的框架会进行argspec检查以选择要传递的内容,因此装饰者必须保留相同的argspec才能更好地发挥作用。当我在#python上提出这个问题时,我得到了一篇关于框架为什么糟糕的长篇演讲,这不是我要找的;我必须在这里解决这个问题。而且,我还我也只是对答案感兴趣)

functools.update\u wrapper()
和/或
functools.wrapps()
足够好吗?

Michele Siminoto's有一个名为decorator的修饰符,它保留函数argspec

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)
这是一个模块:

这使
trace
成为与修饰函数具有相同argspec的修饰器。示例:

>>> @trace
... def f(x, y=1, z=2, *args, **kw):
...     pass

>>> f(0, 3)
calling f with (0, 3, 2), {}

>>> from inspect import getargspec
>>> print getargspec(f)
ArgSpec(args=['x', 'y', 'z'], varargs='args', keywords='kw', defaults=(1, 2))

语法错误:无效语法-我想你的意思是
def func(…
no;它们不保留argspec。
>>> @trace
... def f(x, y=1, z=2, *args, **kw):
...     pass

>>> f(0, 3)
calling f with (0, 3, 2), {}

>>> from inspect import getargspec
>>> print getargspec(f)
ArgSpec(args=['x', 'y', 'z'], varargs='args', keywords='kw', defaults=(1, 2))