You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:05:02