我正在修改以下装饰器类。是否可以获取func
的参数以及访问函数?
def arg(*args, **kwargs):
def _decorator(func):
# check for funcs args
func.do_something(args, kwargs)
return func
return _decorator
因为看起来我尝试的一切都意味着你只能访问其中一个。
答案 0 :(得分:3)
通过访问参数和函数,我不确定你的意思。我猜你的意思是传递给函数的参数。
对于你的用例,对于带有参数的装饰器,你需要另一个包装器函数,它可以针对在运行时传递给函数的kwargs测试kwargs。
示例 -
>>> def arg(*args, **kwargs):
... def _decorator(func):
... def _wrapper(*args1, **kwargs1):
... # check for funcs args
... for k,v in kwargs.items():
... print("For key - ",k,v == kwargs1.get(k))
... func(*args1, **kwargs1)
... return _wrapper
... return _decorator
...
>>>
>>> @arg(l = 1)
... def b(l):
... print("In B", l)
...
>>> b(l=1)
For key - l True
In B 1
>>> b(l=2)
For key - l False
In B 2
编辑:这是针对没有参数的装饰者。
外部函数接收函数作为参数,内部函数接收函数的参数。
一个非常简单的例子 -
>>> def a(func):
... def x(*args, **kwargs):
... print(args, kwargs)
... func(*args, **kwargs)
... return x
...
>>> @a
... def b(y):
... print("In b", y)
...
>>> b("Hello")
('Hello',) {}
In b Hello