2015-09-04 35 views
1

我正在修改以下装饰器类。是否有可能获得func的参数以及访问该函数?创建一个可以访问参数和函数的装饰器

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

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

因为看起来我所尝试过的所有东西都意味着您只能访问其中一个或另一个。

+0

你能澄清你想要的参数做什么? –

+0

@AnandSKumar我只想获得函数的一个kwargs值并将其与传入装饰器的值进行比较。 – nazerb

+0

所以你可以在定义函数时向decorator传递一个关键字参数,并且你希望在运行时调用该函数时测试传递给同一个关键字参数的值? –

回答

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 

+0

在你的例子中,如果@a有像@a('hello2')这样的参数,你将如何访问“hello”和“hello2”? – nazerb

+0

我已经更新了装饰者的参数答案。 –

+0

啊,我现在看到了第二位,正是我所期待的。谢谢。 – nazerb

相关问题