2015-09-04 48 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

相關問題