创建一个可以访问参数和函数的装饰器

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