如何在创建Python Enum时自动扩展字段?FastAPI排序场景
自动生成带_DESC后缀的StrEnum实现方案
要实现定义基础枚举字段后自动生成带负号的降序字段,用元类是最直接的方案,它能在枚举类创建阶段自动扩展成员。以下是完整实现:
1. 自定义枚举元类
继承EnumMeta(StrEnum的底层元类),在类创建时遍历原始成员,自动生成对应的_DESC后缀字段:
from enum import StrEnum, EnumMeta class SortEnumMeta(EnumMeta): def __new__(cls, name, bases, namespace): # 筛选出用户定义的枚举成员(排除下划线开头的内置属性) original_members = { k: v for k, v in namespace.items() if not k.startswith('_') and not callable(v) } # 自动添加降序字段 for enum_key, enum_val in original_members.items(): desc_key = f"{enum_key}_DESC" namespace[desc_key] = f"-{enum_val}" # 调用父类方法完成枚举类创建 return super().__new__(cls, name, bases, namespace)
2. 定义基础排序枚举类
基于StrEnum和上面的元类,创建一个所有排序枚举的基类:
class BaseSortStrEnum(StrEnum, metaclass=SortEnumMeta): pass
3. 业务枚举类示例
直接继承BaseSortStrEnum,只需要定义基础升序字段,降序字段会自动生成:
class UserSortEnum(BaseSortStrEnum): ID = "id" NAME = "name"
4. 验证与FastAPI使用
测试枚举成员:
print(UserSortEnum.ID.value) # 输出: id print(UserSortEnum.ID_DESC.value) # 输出: -id print(UserSortEnum.NAME_DESC.value)# 输出: -name
在FastAPI中作为查询参数使用:
from fastapi import FastAPI, Query app = FastAPI() @app.get("/users") def list_users(sort_by: UserSortEnum = Query(UserSortEnum.ID)): return {"sort_field": sort_by.value}
这样前端请求时,传入sort_by=ID或sort_by=ID_DESC就能直接对应到正确的排序字段,无需手动维护降序枚举值。
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

