我正在编写一个装饰器,它需要在调用它正在装饰的函数之前调用其他函数。修饰的函数可能有位置参数,但修饰程序将调用的函数只能接受关键字参数。有没有人有一个方便的方法将位置参数转换为关键字参数?
我知道我可以获得修饰函数的变量名列表:
>>> def a(one, two=2):
... pass
>>> a.func_code.co_varnames
('one', 'two')但是我不知道如何区分什么是按位置传递的,什么是关键字。
我的装饰器看起来像这样:
class mydec(object):
def __init__(self, f, *args, **kwargs):
self.f = f
def __call__(self, *args, **kwargs):
hozer(**kwargs)
self.f(*args, **kwargs)除了比较kwargs和co_varnames,向kwargs添加任何不在其中的东西,并期待最好的结果之外,还有其他方法吗?
发布于 2019-10-28 03:43:12
Nadia的答案是正确的,但我觉得这个答案的有效演示是有用的。
def decorator(func):
def wrapped_func(*args, **kwargs):
kwargs.update(zip(func.__code__.co_varnames, args))
print(kwargs)
return func(**kwargs)
return wrapped_func
@decorator
def thing(a,b):
return a+b给定此修饰函数后,以下调用将返回相应的答案:
thing(1, 2) # prints {'a': 1, 'b': 2} returns 3
thing(1, b=2) # prints {'b': 2, 'a': 1} returns 3
thing(a=1, b=2) # prints {'a': 1, 'b': 2} returns 3但是请注意,如果你开始嵌套装饰器,事情就会变得很奇怪,因为装饰的函数现在不再接受a和b,它需要args和kwargs:
@decorator
@decorator
def thing(a,b):
return a+b在这里thing(1,2)将输出{'args': 1, 'kwargs': 2}和error with TypeError: thing() got an unexpected keyword argument 'args'
https://stackoverflow.com/questions/830937
复制相似问题