2012-04-18 179 views
7

命名規則我有一個描述符用於描述

class ReferredItem(): 
    def __init__(self, method): 
     self.method = method 

    def __get__(self, obj, objtype): 
     ... 

我用它作爲裝飾:

class MyClass(): 

    @ReferredItem 
    some_method(self): 
     ... 

我見過的裝飾是小寫。但類應以駱駝命名。

我是不是應該叫referred_item這個班?還是保持現狀?

+1

把你的裝飾器寫成閉包很可能會更容易。這也會使這個問題變得過時......(對於它的價值,我會在任何情況下使用'referenced_item')。 – 2012-04-18 15:23:43

+2

我同意,我認爲它更多的是你使用它的方式,所以我會去' referenced_item'' - 在標準庫中有這樣的先例 - 「itertools.chain''是一個類(函數'from_iterable()''),但它被用作函數,所以是小寫的。 – 2012-04-18 15:29:48

+1

@Lattyware:有很多例子:'''''','abc.abstractproperty',關於'itertools'中的所有內容,...以及內置類型('int','float','dict' ,...)。 – 2012-04-18 15:32:57

回答

9

PEP8指出

幾乎沒有例外,類名使用CapWords約定。

沒有解釋什麼是異常,但在標準庫中,最常用作函數的類通常遵循函數命名約定。例如。 itertools.groupby實際上是一個類,但你沒有注意到在普通的用法;這是一個實現細節,並且groupby可以被重寫爲實際功能。

對於用作裝飾器的類,可以使用全小寫裝飾器命名約定來採用相似的樣式:referred_item,而不是ReferredItem

1

PEP8在這一點上不是特別清楚......但非正式地說,我發現一個好規則是:如果一個類將像函數一樣使用(例如,作爲裝飾器,但也包括上下文管理器),它應該有一個像函數一樣的小寫名字。這似乎是標準庫所遵循的慣例。

所以我寧願看referred_itemReferredItem

4

雖然任何可調用的對象都可以用作裝飾器,但它們通常被認爲是函數,函數類對象應遵循「lowercase_with_underscores」約定。

你應該隱藏你的裝飾器是一個類的事實,因爲這是一個實現細節。因此,裝飾器應遵循「lowercase_with_underscores」風格。這樣,如果有一天你決定實現裝飾器作爲一個函數,你不必改變用戶代碼。

個人而言,我仍然會使用CapWords爲(內部)裝飾類名和提供的別名變量應該用於裝飾:

class _ReferredItem: 
    def __init__(self, method): 
     self.method = method 

    def __get__(self, obj, objtype): 
     # ... 

referred_item = _ReferredItem 
+0

在標準庫中找到一個使用snake_case而不是lowercasewithspacesremoved的裝飾器。我想不出任何。 – 2012-04-19 10:29:07

+0

@ChrisMorgan:命名一個:['functools.total_ordering'](http://docs.python.org/library/functools.html#functools.total_ordering) – 2012-04-19 11:30:44

+0

接受的示例。那麼我想我會讓那張表格生活。 (我知道很多標準庫如何使用lowercasewithspacesremoved形式,如果它們在外面的話,它們會在它們中出現下劃線,即使是「int」而不是「Int」。) – 2012-04-19 11:33:13

0

我通常使用駝峯的類,然後添加我用作裝飾器的別名。

referred_item = ReferredItem 
+0

你會使用CamelCase的名字呢?如果沒有,我不明白你爲什麼會讓它存在。 – 2012-04-19 10:30:30

+0

有時候我會的。例如在isinstance調用中。此外,該名稱用於repr。 – yak 2012-04-19 12:19:28