Python枚举的定义和使用(enum)

Posted Xavier Jiezou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python枚举的定义和使用(enum)相关的知识,希望对你有一定的参考价值。


枚举简介

为什么需要枚举?枚举是用来定义常量的。枚举元素具有不可变的特性,可以用来充当常量。

枚举是与唯一常量值绑定的一系列符号名称(成员)的集合。枚举中的元素可以进行恒等比较,并且枚举本身可迭代。

例如,对于圆周率,我们在 Python 中简单定义 PI = 3.14,但 PI 是变量,是可以被修改的,故更严格地定义常量需要用到枚举。本文是对 Python 内置枚举模块 enum 的讲解。

注解:枚举成员名称的大小写
因为枚举是用来表示常量的,因此,枚举成员名称建议使用大写字母,本文的示例将采用此种风格。

模块内容

enum 模块定义了四个枚举类,用来定义名称与值的唯一组合:EnumIntEnumFlagIntFlag。此外,还定义了一个装饰器 unique() 和一个辅助类 auto

  • class enum.Enum:创建枚举常量的基类。
  • class enum.IntEnum:创建 int 子类枚举常量的基类。
  • class enum.Flag:创建可与位运算符搭配使用,而又不失去 Flag 成员资格的枚举常量的基类。
  • class enum.IntFlag:创建可与位运算符搭配使用,而又不失去 IntFlag 成员资格的枚举常量的基类。
  • enum.unique()Enum 类的装饰器,确保一个名称只绑定一个值。
  • class enum.auto:用合适的值代替 Enum 成员的实例。初始默认值从 1 开始。

新建枚举

枚举是用 class 语法创建的,这种方式易读、易写。利用子类 Enum 定义枚举方法如下:

from enum import Enum
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

注解:Enum 成员值
成员值可以是 intstr 等。若无需设定确切值,auto 实例可以自动为成员分配合适的值。将 auto 和其它值混用需慎重。

注解:命名法

  • Color 是枚举(Enum)。
  • Color.REDColor.GREEN 等属性是枚举成员(Enum 成员),也是常量。
  • 枚举成员具有名称和值(例如 Color.RED 的名称为 REDColor.BLUE 的值为3等等)。

注解:虽然 Enumclass 语法创建,但 Enum 并不是常规的 Python 类。

属性访问

可通过名索引访问:

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> Color['RED']
<Color.RED: 1>
>>> Color['GREEN']
<Color.GREEN: 2>
>>> Color['BLUE']
<Color.BLUE: 3>

可通过值索引访问:

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> Color(1)
<Color.RED: 1>
>>> Color(2)
<Color.GREEN: 2>
>>> Color(3)
<Color.BLUE: 3>

如果你有一个枚举成员,可得到它的 name 和 value:

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> member = Color.RED
>>> member.name
'RED'
>>> member.value
1

重复问题

两个枚举成员的名称不能相同:(弹出异常)

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     RED = 2
...
Traceback (most recent call last):
...
TypeError: Attempted to reuse key: 'RED

但两个枚举成员的值可以相同:(不会报错)

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 1
...

确保唯一

默认情况下,枚举允许多个枚举成员具有相同的值。如需禁用此行为,可以使用装饰器 @enum.unique

>>> from enum import Enum, unique
>>> @unique
... class Color(Enum):
...     RED = 1
...     GREEN = 1
... 
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Color'>: GREEN -> RED

自动赋值

enum.auto() 函数可自动为枚举成员分配值:

>>> from enum import Enum, auto
>>> class Color(Enum):
...     RED = auto()
...     GREEN = auto()
...     BLUE = auto()
...
>>> list(Color)
[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]

成员迭代

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> for item in Color:
...     print(item.name, item.value)
...
RED 1
GREEN 2
BLUE 3

比较大小

枚举成员间不允许比较大小:

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> Color.RED < Color.BLUE
Traceback (most recent call last):
...
TypeError: '<' not supported between instances of 'Color' and 'Color'

与非枚举值的比较总不相等:

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3
...
>>> Color.RED == 1
False

温馨提示

枚举模块 enum 在 Python3.4 版本中首次添加,3.4之前的版本使用需安装:

pip install enum

引用参考

https://docs.python.org/3/library/enum.html

以上是关于Python枚举的定义和使用(enum)的主要内容,如果未能解决你的问题,请参考以下文章

Python 枚举

Python枚举的定义和使用(enum)

pydantic学习与使用-9.枚举类型(enum)

Python 的枚举 Enum

干货 - 一文搞定Python 枚举

python3 enum模块