enum - Enumeration¶
从 Python3.4 起, enum
成为了标准库中的一部分. 是枚举常量的不二选择. enum 在 3.4 之前的 backport 替代品是 enum34.
什么时候需要用 enum?¶
Example: Status Code
很多业务代码中会定义状态码. 但是 0, 1, 2 这些状态码对于机器很友好, 但是对于人类意义不明. 最佳实践是在代码中用 enum 枚举定义这些值, 然后 import 枚举. 这样使得代码更加容易维护, 也可以通过语法来避免 typo.
import enum
class StatusCode(enum.Enum):
todo = 0
failed = 1
success = 2
print("Now status code is {}".format(StatusCode.success.value))
Best Practice¶
# -*- coding: utf-8 -*-
import enum
from pytest import raises
class Color(enum.Enum):
red = 1
blue = 2
# 这是主要的访问 Enum 的方式, 可以理解为这是一个 Enum 的实例
_ = Color.red
# Enum 的实例是一个 Enum 的 instance
assert isinstance(Color.red, Color)
# Enum 是 单例 模式. 可以用 is
assert Color.red is Color.red
# 可以用 in 来检查是否在 Enum 中
assert Color.red in Color
# 访问 name
assert Color.red.name == "red"
# 访问 Value
assert Color.red.value == 1
# 根据 name 访问
assert Color["red"] is Color.red
# 根据 value 访问
assert Color(1) is Color.red
# name 不存在会报 KeyError
with raises(KeyError):
_ = Color["green"]
# value 不存在会报 ValueError
with raises(ValueError):
_ = Color(3)
# 遍历所有 enum
for c in Color:
print(c, c.name, c.value)
print(list(Color.__members__.values()))