2016-04-02 118 views
8

我是Python新手,我一直在閱讀在線文檔和(試圖)遵循PEP 0008以獲得良好的Python代碼風格。 我好奇的代碼段我在官方Python發現docs在研究關於重新庫:Python命名約定 - namedtuples

import collections 

Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column']) 

我不明白爲什麼Token變量命名爲與第一個字母大寫;我已經通讀了PEP 0008,對於我所看到的沒有任何參考。如果它不是token改爲或TOKEN如果它是一個常數(我知道這是不是一個常數)?

+5

因爲它是一類 - 'namedtuple'是一個類工廠。 – jonrsharpe

回答

9

在您提供的代碼段中,Tokennamed tuple,絕對不是常量。它不遵循其他變量名稱命名風格,只強調它是類工廠函數。 如果您將其編寫爲token,PEP 0008風格檢查器(例如PyJharm)將不會發生警告,但我認爲這不是好的做法,因爲它不會將其區分爲類工廠名稱。

因此,namedtuples屬於PEP 0008中的Class names。太糟糕了,沒有更明確地說明。 除此之外,您還爲writing a tokenizer提到的例子,這也可以看出,在collections.namedtuple docs例子:

Point = namedtuple('Point', ['x', 'y']) 
Point3D = namedtuple('Point3D', Point._fields + ('z',)) 
Book = namedtuple('Book', ['id', 'title', 'authors']) 
+0

反Haapala的答案打敗了我。很好的答案。 – Yannis

+0

那麼你的答案是更好的:d –

+0

兩個很好的答案,我真的很喜歡鏈接到PEP 0008.謝謝 – Karim

8

這裏的關鍵是collections.namedtuple。由於文件說,

collections.namedtuple(typename, field_names, verbose=False, rename=False)

返回一個新tuple命名typename。新的子類用於創建類似tuple的對象,該對象具有可通過屬性查找訪問的字段以及可索引和可​​迭代的對象。子類的實例也有一個有用的文檔字符串(帶有typename和field_names)和一個有幫助的__repr__()方法,該方法以name=value格式列出元組內容。

沒有PEP 8違規; Token是一個用戶定義的類,其名稱應該是大寫。