【问题标题】:Create a decorator that has access to both the arguments and function创建一个可以访问参数和函数的装饰器
【发布时间】:2015-09-04 10:34:17
【问题描述】:

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

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

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

似乎我尝试过的所有东西都意味着您只能访问其中一个。

【问题讨论】:

  • 你能澄清一下你想对这些参数做什么吗?
  • @AnandSKumar 我只想获取函数的 kwargs 之一的值,并将其与传递给装饰器的值进行比较。
  • 所以你会在定义函数时将关键字参数传递给装饰器,并且你想在运行时调用函数时测试传递给相同关键字参数的值对吗?

标签: python function methods arguments decorator


【解决方案1】:

我不确定访问参数和函数是什么意思。我猜你的意思是传递给函数的参数。

对于您的用例,对于接受参数的装饰器,您需要另一个包装函数,它会针对运行时传递给函数的 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

【讨论】:

  • 在您的示例中,如果 @a 有诸如 @a('hello2') 之类的参数,您将如何访问“hello”和“hello2”?
  • 我已经更新了带有参数的装饰器的答案。
  • 啊,我现在看到了第二位,正是我想要的。谢谢。
  • 哦,这只适用于一个 @arg(l =1) 装饰器,如果我想添加一对运行的会发生什么?比如@arg(l =1) @arg(o=2) 等?
  • 它们也应该可以工作。这可以在装饰器中使用任何数量的参数。你有什么错误吗?
猜你喜欢
  • 2020-06-20
  • 2011-06-25
  • 1970-01-01
  • 2011-09-22
  • 2014-03-27
  • 2021-10-01
  • 2014-01-25
  • 2020-11-22
相关资源
最近更新 更多