枚舉類型可以看作是一種標籤或是一系列常數的集合,通常用來表示某些特定的有限集合,例如星期、月份、狀態等。 Python 的原生類型(Built-in types)裡並沒有專門的枚舉類型,但是我們可以透過很多方法來實現它,例如字典、類別等:
WEEKDAY = { 'MON': 1, 'TUS': 2, 'WEN': 3, 'THU': 4, 'FRI': 5 } class Color: RED = 0 GREEN = 1 BLUE = 2
上面兩種方法可以看做是簡單的枚舉類型的實現,如果只在局部範圍內用到了這樣的枚舉變數是沒有問題的,但問題在於它們都是可變的(mutable),也就是說可以在其它地方被修改從而影響其正常使用:
WEEKDAY['MON'] = WEEKDAY['FRI'] print(WEEKDAY) {'FRI': 5, 'TUS': 2, 'MON': 5, 'WEN': 3, 'THU': 4} 通过类定义的枚举甚至可以实例化,变得不伦不类: c = Color() print(c.RED) Color.RED = 2 print(c.RED) 0 2
當然也可以使用不可變類型(immutable),例如元組,但是這樣就失去了枚舉類型的本意,將標籤退化為無意義的變數:
COLOR = ('R', 'G', 'B') print(COLOR[0], COLOR[1], COLOR[2]) R G B
為了提供更好的解決方案,Python 透過PEP 435 在3.4 版本中新增了enum 標準函式庫,3.4 之前的版本也可以透過pip install enum 下載相容支援的函式庫。 enum 提供了Enum/IntEnum/unique 三個工具,用法也非常簡單,可以透過繼承Enum/IntEnum 定義枚舉類型,其中IntEnum 限定枚舉成員必須為(或可以轉化為)整數類型,而unique 方法可以作為修飾器限定枚舉成員的值不可重複:
from enum import Enum, IntEnum, unique try: @unique class WEEKDAY(Enum): MON = 1 TUS = 2 WEN = 3 THU = 4 FRI = 1 except ValueError as e: print(e) duplicate values found in : FRI -> MON try: class Color(IntEnum): RED = 0 GREEN = 1 BLUE = 'b' except ValueError as e: print(e) invalid literal for int() with base 10: 'b'
以上是什麼是枚舉python的詳細內容。更多資訊請關注PHP中文網其他相關文章!