2012-06-09 154 views
19

Python裝飾器的內部是否有任何「公認」的命名約定?裝飾器中的Python命名約定

style guide沒有提及它,並且this awesome entry about decorators在使用「wrapped」變體進行返回的最終功能方面非常一致,但創建帶參數的裝飾器時使用的名稱又如何呢?

def decorator_name(whatevs): 
    def inner(function): 
     def wrapped(*args, **kwargs): 
      # sweet decorator goodness 
     return wrapped 
    return inner 

具體而言,什麼是在上述例子中爲innerfunctionwrapped公約?

回答

17

這些名稱沒有標準化的約定(如PEP)。如果你檢查python stdlib,你會發現這些函數有很多不同的名字。

但是,decorator是裝飾器功能inner的常用名稱。
您也可以撥打wrapped函數wrapper並用functools.wraps(f)修飾它,其中f是包裝函數(func也是它的通用名稱)。

def decorator_name(whatevs): 
    def decorator(f): 
     @wraps(f) 
     def wrapper(*args, **kwargs): 
      pass # sweet decorator goodness 
     return wrapper 
    return decorator 
+5

func可能比f更具可讀性。 – jfs

+3

呃,如果你有一個名爲'decorator'的單參數函數,那麼它很清楚它的參數是什麼,不管它叫什麼。 – Ben

+0

調用內部函數'decorator'可能是一個非常好的主意,因爲'decorator_name'不是一個真正的裝飾器,而是一個*裝飾器工廠*,嵌套函數定義的多個層次可能會有點混亂。 – Ben

0

根據定義,Python中的裝飾可以是一個函數或類,因此實現的類型(類或函數),是決定命名約定使用哪個因素。 一個常見的錯誤是用關鍵字裝飾器將函數的名稱加上前綴。 有關修飾器的更多信息,請參閱link