2014-02-11 33 views
7

從來沒有想過我會需要這樣做,但在這裏我打算在python 2.7中使用枚舉。python2.7中最小的非官方枚舉支持 - flufl.enum或enum34?

有Barry's flufl.enum,其中PEP 435表示「......是PEP最初基於的參考實現」。

但是在pypi上也有一個backport enum34

這些看起來都是半官方的,那麼我應該在新代碼中使用哪一個?

「應該有一個明顯的方法來做到這一點」,但這對於谷歌來說是一個艱難的話題,因爲有幾十(幾百?)個手動實現。而python 3.4枚舉仍然只是一個候選版本。

我已經試過了flufl.enum.Enumenum34.Enum,並且行爲是完全不同的 - 最明顯的是__getitem__的不同語義。根據Martijn Pieters的這個comment,backport是/具有挑戰性的,因爲實現依賴於元類上的新的__prepare__函數。我已閱讀this帖子和PEP整體。

+1

另請參閱:http://packages.python.org/flufl.enum/docs/using.html#differences-from-pep-354 –

回答

9

enum34Python3.4匹配,所以這是一個使用。

的反向移植和3.4的之間的一個很大的區別:

  • 在Python 2你不能定義順序(因爲__prepare__還不存在),但有一個變通 - 定義_order_,它將成爲Python 2中的「定義順序」(它在Python 3中簡單地被忽略)。如果您沒有使用解決方法,則使用的順序是成員的值,按升序排列。

更新

  • 優選拼寫現在是_order_(單取代雙前緣和後下劃線)

  • Python3.6 +將檢查_order_實際順序一致(用於保持Python 2/3代碼同步)


披露:我是Python stdlib Enum的作者,enum34 backportAdvanced Enumeration (aenum)庫。