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

时间:2015-09-04 10:34:17

标签: python function methods arguments decorator

我正在修改以下装饰器类。是否可以获取func的参数以及访问函数?

def arg(*args, **kwargs):
    def _decorator(func):
        # check for funcs args

        func.do_something(args, kwargs)
        return func
    return _decorator

因为看起来我尝试的一切都意味着你只能访问其中一个。

1 个答案:

答案 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