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()))

Generic Enum Getter