Python如何实现支持属性访问、值遍历的枚举常量集合
最符合要求的Pythonic实现是使用标准库自带的enum模块,无需引入第三方依赖,天生适配常量定义场景,不可变特性也能避免常量被意外修改。
基础实现(兼容Python 3.4+)
from enum import Enum # 先定义支持值判断的枚举基类,可复用在所有常量集合定义中 class ValueCheckEnum(Enum): @classmethod def __contains__(cls, item): return item in (member.value for member in cls) # 定义PDF类型常量集合 class PDF_TYPES(ValueCheckEnum): summary = 'summary' report = 'report' # 暴露单个常量供直接导入使用 SUMMARY = PDF_TYPES.summary.value REPORT = PDF_TYPES.report.value
更简洁的实现(Python 3.11+)
3.11以上版本可以使用StrEnum,枚举成员本身等价于对应字符串值,无需额外调用.value属性:
from enum import StrEnum class ValueCheckStrEnum(StrEnum): @classmethod def __contains__(cls, item): return item in cls.__members__.values() class PDF_TYPES(ValueCheckStrEnum): summary = 'summary' report = 'report' # 暴露单个常量 SUMMARY = PDF_TYPES.summary REPORT = PDF_TYPES.report
需求匹配验证
- 单个常量引用:其他模块可直接通过
from xxx import REPORT导入使用,和普通常量用法完全一致 - 属性访问:导入整个常量集合后,直接使用
PDF_TYPES.report即可拿到对应值,比字典访问更简洁 - 成员判断:直接写
if x not in PDF_TYPES:即可判断值是否属于常量集合,完全符合要求
内容的提问来源于stack exchange,提问作者run_the_race
相关产品推荐
相关产品推荐

