2014-01-25 69 views
0

我有2個問題。我創建了一個裝飾器來檢查字典是否有密鑰?這裏是。Python-我可以在函數內使用裝飾器嗎?

def check_has_key(func): 
    def inner(x,y): # inner function needs parameters 
     dictionary = {"add" : "true", "subtract" : "true"} 
     if dictionary.has_key("add") : 
      return func(x,y) 
     return "Add not allowed" 
    return inner # return the inner function (don't call it) 

@check_has_key 
def add(x,y): 
    return x+y 

print add(1,2) 

1)我可以傳遞密鑰作爲參數來包裝,然後檢查它是否存在與否?例如: - 就像我通過的密鑰爲@check_has_ket("subtact")

2)我可以在函數內部使用裝飾器嗎?如果我需要檢查字典是否有密鑰,深入該函數?

編輯

我得到了第一問題的答案。

def abc(a): 
    def check_has_key(func): 
     def inner(x,y): # inner function needs parameters 
      dictionary = {"add" : "true", "subtract" : "true"} 
      if dictionary.has_key(a) : 
       return func(x,y) 
      return "Add not allowed" 
     return inner # return the inner function (don't call it) 
    return check_has_key 

@abc("subtract") 
def add(x,y): 
    return x+y 

print add(1,2) 

但我的疑問仍然存在,我可以使用裝飾深入功能?這意味着如果我需要檢查字典中是否存在關鍵字,或者沒有深入瞭解函數,我可以使用裝飾器來達到這個目的,還是隻需要使用if條件?

+0

爲什麼你要定義字典_內側函數?不會'dictionary.has_key'永遠是真的呢?無論如何你創建裝飾器函數的目標是什麼?順便說一句,你可以在你定義函數的地方使用裝飾器。 – aIKid

+0

(1)裝飾器只在定義一個函數時使用,或者我可以像這樣使用,意思是在行或代碼之間? (2)裝飾器執行的順序是什麼,如果我在1個函數上有多個裝飾器? –

+0

也許這對裝飾器[回答](http://stackoverflow.com/a/1594484/1672128)可能有所幫助。閱讀它,就像你需要知道的關於裝飾器的一切。 –

回答

0

如果您需要參數化裝飾器,您可以定義一個類,通過__init__傳遞裝飾器的參數並覆蓋它的__call__函數。例如:

class decorate: 

    def __init__(self, decorator_arg): 
     self.decorator_arg = decorator_arg 

    def __call__(self, func): 
     def inner(x,y): 
      # do something, probably using self.decorator_arg 
      return func(x,y) 
     return inner 

@decorate("subtract") 
def add(x,y): 
    return x+y 

對於(2),是的,如果你有另一個函數來裝飾你的函數。如果你需要做這樣的事情,你可能只需要一個函數而不是裝飾器。

+0

我知道是否有嵌套函數可以使用裝飾器,但在我的情況下沒有嵌套函數。這只是簡單的代碼行。也請看我編輯的問題,並檢查我以我的方式完成了(1)。這是否是正確的做法? –

+0

是的,你對(1)的方式也很好。如果沒有其他函數,裝飾器就是用來_decorate函數_的,你根本不需要裝飾器。你只需要另一個可以在多個地方重用的函數。如果裝飾函數必須知道_it_已被修飾,或者甚至需要在裝飾體內部觸摸該修飾符,那麼使用修飾符的方式是錯誤的。 –

+0

裝飾器執行的順序,如果我有1個函數上的多個裝飾器? –

相關問題