gpt4 book ai didi

Python 创建装饰器保留函数参数

转载 作者:太空狗 更新时间:2023-10-29 22:29:08 26 4
gpt4 key购买 nike

我正在尝试编写一个装饰器来保留它所装饰的函数的参数。这样做的动机是编写一个与 pytest.fixtures 良好交互的装饰器。

假设我们有一个函数foo。它接受一个参数 a

def foo(a):
pass

如果我们得到 foo 的参数说明

>>> inspect.getargspec(foo)
ArgSpec(args=['a'], varargs=None, keywords=None, defaults=None)

我们经常想创建一个装饰器,其中 wrapper 函数将其所有参数逐字传递给 wrapped 函数。最明显的方法是使用 *args**kwargs

def identity_decorator(wrapped):
def wrapper(*args, **kwargs):
return wrapped(*args, **kwargs)
return wrapper

@identity_decorator
def foo(a):
pass

毫不奇怪,这会生成一个函数,其参数规范反射(reflect)了 *args**kwargs

>>> inspect.getargspec(foo)
ArgSpec(args=[], varargs='args', keywords='kwargs', defaults=None)

有没有一种方法可以更改参数规范以匹配包装的函数,或者最初使用正确的参数规范创建函数?

最佳答案

AFAIK,只有从 Python 3.3 开始才有可能使用 Signature 对象:

def identity_decorator(wrapped):
def wrapper(*args, **kwargs):
return wrapped(*args, **kwargs)
wrapper.__signature__ = inspect.signature(wrapped) # the magic is here!
return wrapper

然后,您可以:

@identity_decorator
def foo(a):
pass

最后:

>>> inspect.getargspec(foo)
ArgSpec(args=['a'], varargs=None, keywords=None, defaults=None)

关于Python 创建装饰器保留函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39926567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com