目录:
Python 的 enum 模块是标准库中用于创建枚举类型的强大工具,从 Python 3.4 版本开始引入。
Enum 是 enum 模块的基础类,用于创建标准的枚举类型。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
print(Color.RED.name) # 'RED'
print(Color.RED.value) # 1
枚举成员有两个重要属性:name 和 value,分别用于获取成员的名称和值。
例如,Color.RED.name 返回 ‘RED’,Color.RED.value 返回 1。
IntEnum 是 Enum 的子类,其成员同时也是整数的子类,这意味着它们可以直接与整数进行比较和运算。
from enum import IntEnum
class HttpStatus(IntEnum):
OK = 200
NOT_FOUND = 404
SERVER_ERROR = 500
print(HttpStatus.OK == 200) # 输出:True
print(HttpStatus.OK + 100) # 输出:300
从 Python 3.11 开始,引入了 StrEnum 类,其成员是字符串的子类,可以直接与字符串进行比较。
from enum import StrEnum # Python 3.11+
class LogLevel(StrEnum):
DEBUG = "DEBUG"
INFO = "INFO"
WARNING = "WARNING"
ERROR = "ERROR"
print(LogLevel.DEBUG == "DEBUG") # 输出:True
print(LogLevel.DEBUG.lower()) # 输出:'debug'
Flag 和 IntFlag 是特殊的枚举类,支持按位运算符(&、|、^、~),适用于需要组合多个标志的场景。
如下示例:ADMIN 是其它几个枚举的组合。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
ADMIN = READ | WRITE | EXECUTE
当不关心枚举成员的具体值时,可以使用 auto() 函数自动分配值。
对于基本的 Enum 类,auto() 会从 1 开始递增分配整数值。
from enum import Enum, auto
class Color(Enum):
RED = auto() # 1
GREEN = auto() # 2
BLUE = auto() # 3
对于标志枚举类 Flag,auto() 会自动分配 2 的整数次方值(从 1 开始),确保每个标志的位是唯一的。
from enum import Flag, auto
class Permission(Flag):
READ = auto() # 1
WRITE = auto() # 2
EXECUTE = auto() # 4
ADMIN = READ | WRITE | EXECUTE # 7
默认情况下,枚举成员的值可以重复,但名称必须唯一,否则会报 TypeError 错误。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
RED = 3
print(Color.RED)
# raise TypeError('%r already defined as %r' % (key, self[key]))
# TypeError: 'RED' already defined as 1
当多个成员具有相同的值时,第二个及之后的成员被视为第一个成员的别名。如下示例,BLUE 会被认为是 RED 的别名,所以三个比较都会返回 True。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 1
print(Color.RED == Color.BLUE) # True
print(Color.RED.name == Color.BLUE.name) # True
print(Color.RED.value == Color.BLUE.value) # True
如果需要确保所有成员的值都是唯一的,可以使用 @unique 装饰器。
from enum import Enum, unique
@unique
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 1 # 这会引发ValueError:duplicate values found
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
for color in Color:
print(color, color.name, color.value)
# Color.RED RED 1
# Color.GREEN GREEN 2
# Color.BLUE BLUE 3
↶ 返回首页 ↶