extended-enum 完整使用文档
一、extended-enum 概述与核心功能
1. 基础介绍
extended-enum是 Python 第三方枚举增强库,基于标准库enum.Enum做功能扩展,解决原生枚举短板:原生 Enum 仅支持名称、值映射,缺少多字段存储、序列化、数据库映射、快速检索、自动生成标签/描述、字典互转、校验、批量操作等能力。
项目核心定位:带附加属性的增强枚举,兼容标准 Enum 所有语法,无缝迁移原生枚举代码。
2. 核心功能清单
- 多附属字段绑定:单个枚举项可存储 name、value、label、desc、code、sort、status 等任意自定义字段,无需额外字典映射;
- 多维度反向查找:支持按 value、label、自定义字段快速查询枚举实例,原生 Enum 仅能按 value/name 查找;
- 序列化与反序列化:一键转字典、JSON、元组列表,支持数据库 ORM 直接存储/读取;
- 内置校验工具:判断值是否合法、批量校验输入数组、获取所有合法取值集合;
- 排序与过滤:按自定义 sort 字段排序、按状态/标签筛选子集枚举;
- 别名与兼容:兼容原生 Enum
__members__、Enum(value)构造方式,支持自定义别名; - 自动属性访问:通过
.label.desc直接读取附加字段,无需封装类; - 批量工具:获取全部选项、下拉框数据源、前端枚举常量导出;
- 空值/默认值兼容:支持设置默认枚举项、空输入兜底。
二、安装方式
1. pip 标准安装
pipinstallextended-enum2. 指定版本安装
pipinstallextended-enum==0.4.03. 源码安装(开发版)
gitclone https://github.com/yourname/extended-enum.gitcdextended-enum python setup.pyinstall4. 依赖说明
仅依赖 Python 内置库(enum、json),无第三方额外依赖,支持 Python3.7~3.12。
三、基础语法、核心类与参数说明
3.1 核心导入
fromextended_enumimportExtendedEnum,EnumFieldExtendedEnum:增强枚举基类,继承它定义业务枚举;EnumField:枚举字段构造器,用于定义多属性枚举项。
3.2 EnumField 构造参数(核心)
EnumField(value, label=None, desc=None, sort=0, **kwargs)
| 参数 | 类型 | 说明 |
|---|---|---|
| value | 任意可哈希类型(int/str) | 枚举唯一主键,等价原生 Enum 的 value,查询核心键 |
| label | str | 展示标签,前端下拉、页面展示用 |
| desc | str | 详细描述,日志、文档、注释展示 |
| sort | int | 排序权重,list()输出时按 sort 升序排列 |
| **kwargs | 任意键值 | 自定义扩展字段,如status=1、is_valid=True、db_code="A01" |
3.3 ExtendedEnum 内置方法与属性
实例属性(单个枚举项)
假设枚举实例Status.ENABLE:
.name:枚举常量名(如ENABLE).value:主键值.label:标签.desc:描述.sort:排序值- 自定义字段直接访问:
.is_valid、.db_code
类方法(全局枚举操作)
get_by_value(val, default=None):按 value 查找枚举,找不到返回 defaultget_by_label(label, default=None):按 label 反向查找get_by_field(field_name, field_val, default=None):按任意自定义字段查找values():返回所有 value 列表labels():返回所有 label 列表items():返回[(value, label), ...]下拉框数据源to_dict():全枚举转为字典{value: 完整字段dict}to_json():输出 JSON 字符串is_valid(val):判断传入 value 是否属于合法枚举filter_by(field, target_val):筛选指定字段匹配的枚举子集sorted_list():按 sort 字段升序返回枚举实例列表__members__:兼容原生枚举,返回常量名-实例映射
3.4 基础定义语法模板
fromextended_enumimportExtendedEnum,EnumFieldclassOrderStatus(ExtendedEnum):# 格式:常量名 = EnumField(主键值, 标签, 描述, 排序, 自定义参数)PENDING=EnumField(0,"待支付","用户已下单未付款",sort=1,is_end=False)PAID=EnumField(1,"已支付","付款完成待发货",sort=2,is_end=False)DELIVERED=EnumField(2,"已发货","商品出库配送",sort=3,is_end=False)FINISH=EnumField(3,"已完成","订单签收结束",sort=4,is_end=True)CANCEL=EnumField(9,"已取消","用户主动取消",sort=5,is_end=True)四、8 个完整实战应用案例
案例1:后端接口下拉框数据源(最常用)
场景:后端返回前端下拉选择列表,需要 value+label 二元组
fromextended_enumimportExtendedEnum,EnumFieldclassOrderStatus(ExtendedEnum):PENDING=EnumField(0,"待支付","未付款订单",sort=1)PAID=EnumField(1,"已支付","待发货",sort=2)FINISH=EnumField(3,"已完成",sort=3)# 获取前端下拉数据源dropdown=OrderStatus.items()print(dropdown)# 输出:[(0, '待支付'), (1, '已支付'), (3, '已完成')]# FastAPI/Flask 接口直接返回# return {"options": OrderStatus.items()}案例2:按 value/自定义字段反向查询枚举
场景:数据库存储数字值,业务代码转换为带标签的枚举对象
# 数据库取出状态值 db_status = 1db_status=1status=OrderStatus.get_by_value(db_status)print(status.label)# 已支付# 按自定义字段查询:筛选已结束订单end_status=OrderStatus.get_by_field("is_end",True,default=None)案例3:参数合法性校验(接口入参校验)
场景:校验前端传入状态码是否合法,防止非法参数
defcheck_order_status(input_status):ifnotOrderStatus.is_valid(input_status):raiseValueError(f"非法订单状态:{input_status}")returnOrderStatus.get_by_value(input_status)check_order_status(0)# 正常# check_order_status(99) # 抛出异常案例4:枚举转JSON,前后端全量常量下发
场景:前端需要全量枚举常量做本地判断,一次性序列化所有属性
json_str=OrderStatus.to_json()print(json_str)# {"0": {"value":0,"label":"待支付","desc":"未付款订单","sort":1}, "1": {...}}案例5:业务状态过滤(筛选完结/进行中订单)
场景:报表统计只需要已完成、已取消的完结订单
# 筛选所有 is_end=True 的枚举end_status_list=OrderStatus.filter_by("is_end",True)print([item.labelforiteminend_status_list])# ['已完成', '已取消']案例6:ORM 数据库映射存储与读取
场景:SQLAlchemy/ Django ORM 存数字,读取自动转枚举对象
# 存入数据库直接取 .valuestatus_val=OrderStatus.PENDING.value# 0# 从数据库读取后还原枚举db_val=3order_status=OrderStatus.get_by_value(db_val)print(f"状态名称:{order_status.name}, 展示名:{order_status.label}")案例7:按 sort 自定义排序输出枚举
场景:页面下拉需要自定义展示顺序,不按 value 数字排序
# 定义时 sort 打乱classUserLevel(ExtendedEnum):VIP3=EnumField(3,"VIP3",sort=1)VIP1=EnumField(1,"VIP1",sort=2)VIP2=EnumField(2,"VIP2",sort=3)# 按sort升序输出sorted_levels=UserLevel.sorted_list()print([item.labelforiteminsorted_levels])# ['VIP3', 'VIP1', 'VIP2']案例8:批量日志打印、异常文案统一管理
场景:错误码枚举统一管理错误码、错误文案、日志描述
classErrorCode(ExtendedEnum):PARAM_ERR=EnumField(1001,"参数非法","接口请求参数缺失或格式错误",sort=1)AUTH_FAIL=EnumField(2001,"登录失效","token过期,请重新登录",sort=2)ORDER_NOT_EXIST=EnumField(3001,"订单不存在","查询的订单ID未找到",sort=3)# 全局异常捕获统一返回defget_err_msg(code:int):err=ErrorCode.get_by_value(code)return{"code":err.value,"msg":err.label,"log_desc":err.desc}print(get_err_msg(1001))# {'code': 1001, 'msg': '参数非法', 'log_desc': '接口请求参数缺失或格式错误'}五、常见错误、报错原因与解决方案
错误1:LookupError: No matching enum found
触发代码:OrderStatus.get_by_value(99)且未传 default
- 原因:传入的 value 在枚举中不存在,无兜底默认值
- 解决:传入 default 参数捕获空值
status=OrderStatus.get_by_value(99,default=None)ifstatusisNone:print("状态不存在")
错误2:AttributeError: ‘ExtendedEnum’ object has no attribute ‘xxx’
- 原因1:未在 EnumField 定义自定义字段,直接访问
.xxx
解决:定义时补充xxx=xxx_value - 原因2:常量名拼写错误(如
.PAID写成.PAIDED)
解决:核对枚举常量名称
错误3:TypeError: unhashable type: ‘list’
- 原因:EnumField 的 value 使用列表、字典等不可哈希类型,value 必须 int/str/tuple
- 解决:value 改用字符串或数字主键
错误4:多个枚举项 value 重复
报错:ValueError: duplicate enum value
- 原因:不同常量设置了相同 value,value 是唯一索引
- 解决:保证每个枚举项 value 全局唯一
错误5:filter_by 返回空列表
- 原因:筛选字段名/字段值不匹配(大小写、类型不一致,如数字1和字符串"1")
- 解决:统一字段值数据类型,核对字段名拼写
错误6:to_json 序列化报错(自定义对象无法序列化)
- 原因:EnumField 传入了无法 json 序列化的自定义字段(datetime、自定义类实例)
- 解决:存储基础类型(int/str/bool),复杂对象转字符串存储
错误7:继承普通 Enum 混用 ExtendedEnum 方法
fromenumimportEnumclassDemo(Enum):A=0Demo.items()# 报错- 原因:仅
ExtendedEnum拥有扩展方法,原生 Enum 无 items/get_by_value 等 - 解决:基类改为
ExtendedEnum
六、使用注意事项与最佳实践
1. 定义规范
- 枚举常量名统一大写下划线(
ORDER_PAID),遵循常量命名规范; - value 优先使用 int,数据库存储更节省空间;前端展示文字统一放入 label;
- 业务区分字段全部通过
EnumField关键字参数传入,不要使用外部字典映射; - sort 统一规划,避免后期下拉顺序混乱。
2. 查询与容错规范
- 所有外部输入(接口参数、数据库读取)查询枚举必须加
default=None兜底; - 参数校验统一使用
.is_valid(),不要手动判断 value 是否在列表; - 多业务区分使用独立枚举类(订单状态、用户等级、错误码分开定义)。
3. 序列化与前后端交互
- 前端下拉框固定使用
.items(),轻量化仅返回 value-label; - 前端需要完整常量配置使用
.to_json(); - 禁止直接将枚举实例对象返回接口,必须转字典/元组。
4. 性能注意
- 枚举类加载后全局缓存,无需重复实例化;
- 百万次循环查询
.get_by_value()性能优于字典,底层做了哈希缓存; - 超大枚举(>100项)不建议一次性 to_json,按需 filter 子集下发。
5. 兼容性
- 完全兼容原生 Enum 写法,原有
Enum(1)、OrderStatus.PAID.name均可正常使用; - 可与 Pydantic、FastAPI 搭配做类型校验,直接作为模型字段类型;
- 不支持运行时动态新增枚举项,枚举为静态常量,如需动态配置请使用数据库字典表。
6. 避坑要点
- 不要把业务逻辑写在枚举类内,枚举仅存储静态属性;
- 自定义字段避免使用保留关键字:value、label、desc、sort、name;
- 布尔类筛选字段统一命名
is_xxx(is_end、is_valid)便于过滤; - 不要使用浮点数作为 value,浮点精度会导致查找匹配失败。
《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章,前6章涵盖深度学习基础,包括张量运算、神经网络原理、数据预处理及卷积神经网络等;后5章进阶探讨图像、文本、音频建模技术,并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法,每章附有动手练习题,帮助读者巩固实战能力。内容兼顾数学原理与工程实现,适配PyTorch框架最新技术发展趋势。