gpt4 book ai didi

python - 如何在允许装饰器参数的同时保留函数的签名?

转载 作者:行者123 更新时间:2023-11-28 18:33:45 28 4
gpt4 key购买 nike

我正在尝试编写一个装饰器,它将根据 kwargs 执行一些操作,同时我想保留函数签名。

这是我要通过的单元测试:

def test_test_deprecator(self):

@test_deprecator("here is decorator message", 'z'):
def some_method(x, y, z):
return x + y

self.assertEqual(some_method(2, 2, z=6), 4)

# test the original function's signature
argspec = inspect.getargspec(some_method)
self.assertEqual(argspec.args, ["x", "y", "z"])

我写的是这样的:

import decorator

def test_decorator(message, args_name):

@decorator.decorator
def _test_docorator(f, *args, **kwargs):
if args_name in kwargs:
print(message)
return f(*args, **kwargs)

return _test_docorator

单元测试可以通过,但是没有输出信息,因为kwargs一直是空的。

有人知道怎么实现吗?

最佳答案

我不确定 @decorator.decorator 在你的代码中的作用是什么,但这里有一个装饰器在做你描述的事情:

def test_decorator(message, arg_name):
def _test_decorator(f):
def wrapped_f(*args, **kwargs):
if arg_name in kwargs:
print(message)
return f(*args, **kwargs)
return wrapped_f
return _test_decorator

更新后的答案:

我了解了一些有关装饰器的知识。不过,简而言之,我认为使用 wrapt 模块会适合您:

def test_decorator(message, arg_name):
@wrapt.decorator
def wrapped_f(f, instance, args, kwargs):
if arg_name in kwargs:
print(message)
return f(*args, **kwargs)
return wrapped_f

测试代码:

@test_decorator('found it', 'y')
def foo(x="bad", y="dog"):
print("x={}, y={}".format(x, y))

def bar(x="bad", y="dog"):
print("x={}, y={}".format(x, y))

print ("foo argspec={}".format(inspect.getargspec(foo)))
print ("bar argspec={}".format(inspect.getargspec(bar)))

foo(y='cat')

输出:

foo argspec=ArgSpec(args=['x', 'y'], varargs=None, keywords=None, defaults=('bad', 'dog'))
bar argspec=ArgSpec(args=['x', 'y'], varargs=None, keywords=None, defaults=('bad', 'dog'))
found it
x=bad, y=cat

关于python - 如何在允许装饰器参数的同时保留函数的签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34388880/

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