【发布时间】:2022-06-11 17:42:44
【问题描述】:
这是一个相当棘手的问题。我希望我做得很好。为了澄清,这里是一个示例装饰器:
class my_decorator:
def __init__(self, option=None):
self.option = option
def __call__(self, fn):
@functools.wraps(fn)
def decorated(*args, **kwargs):
fn_args = inspect.signature(fn).parameters
# Code that creates local variables by taking the values that
# arrived in *args and **kwargs in exactly the same way that
# they are inside fn proper.
return fn(*args, **kwargs)
return decorated
如果还不清楚,我们可以通过查看所述装饰器的应用程序来为提案添加解释性细节:
@my_decorator()
def my_function(arg1, arg2, arg3, kwarg1=val1, kwarg2=val2)
# In here we see the variables arg1, arg2, arg3, kwarg1 and kwarg2
挑战在于,我们能否使用fn_args 在def decorated(*args, **kwargs): 内部创建变量arg1、arg2、arg3、kwarg1 和kwarg2。
我有直觉认为这是可以做到的,但这需要一些深入的思考,我想知道这不是已经发明的轮子。我的意思是,也许已经有一种规范的方法可以将函数签名应用于匿名 *args、**kwargs 以生成与该签名一致的局部变量。
我愿意这样想。也就是说,我不是第一个发现这种愿望/欲望的人。当然,我有一个真正的风险。因为这对我来说一般效用似乎很低。我有一个非常具体的应用程序,其中传入的option 是一个格式字符串(样式为“{arg1},{arg2} ...”),它使用修饰函数的参数列表中的名称。
【问题讨论】:
标签: python python-3.x python-decorators signature