创建一个可以访问参数和函数的装饰器
Create a decorator that has access to both the arguments and function
我正在修改下面的装饰器class。是否可以获取 func
的参数以及访问该函数?
def arg(*args, **kwargs):
def _decorator(func):
# check for funcs args
func.do_something(args, kwargs)
return func
return _decorator
似乎我已经尝试了所有方法,这意味着您只能访问一个或另一个。
我不确定您所说的访问参数和函数是什么意思。我猜你的意思是传递给函数的参数。
对于你的用例,对于接受参数的装饰器,你需要另一个包装函数,它会根据运行时传递给函数的 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
我正在修改下面的装饰器class。是否可以获取 func
的参数以及访问该函数?
def arg(*args, **kwargs):
def _decorator(func):
# check for funcs args
func.do_something(args, kwargs)
return func
return _decorator
似乎我已经尝试了所有方法,这意味着您只能访问一个或另一个。
我不确定您所说的访问参数和函数是什么意思。我猜你的意思是传递给函数的参数。
对于你的用例,对于接受参数的装饰器,你需要另一个包装函数,它会根据运行时传递给函数的 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