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

使用auto()、字符串值和额外属性子类化Python Enum的问题

解决Python Enum结合auto()与自定义参数的问题

当你给Enum项同时使用auto()和自定义参数(比如指定function属性)时,默认的Enum机制不会触发_generate_next_value_方法,导致枚举值变成enum.auto对象。下面是直接可用的实现方案,完美满足你的两个需求:

完整实现代码

from enum import Enum, auto

class FunctionEnum(Enum):
    @staticmethod
    def _generate_next_value_(name, start, count, last_values):
        # 默认用枚举项名称的小写作为值
        return name.lower()

    def __new__(cls, value=None, function=None):
        # 处理值为auto()的情况
        if value is auto():
            # 通过_member_names_获取当前枚举项的名称
            # _member_names_按定义顺序存储所有枚举项,count是已创建的成员数量
            count = len(cls.__members__)
            name = cls._member_names_[count]
            # 调用_generate_next_value_生成默认值
            value = cls._generate_next_value_(name, None, count, None)
        
        # 创建枚举实例并设置核心属性
        obj = object.__new__(cls)
        obj._value_ = value
        # function属性:有自定义值则用自定义的,否则默认用生成的value
        obj.function = function if function is not None else value
        return obj

# 测试示例
class MyFunctions(FunctionEnum):
    GET_USER = auto()
    CREATE_POST = auto(), "create_new_post"  # 自定义function名称
    UPDATE_PROFILE = auto(), "update_user_profile"

验证结果

运行后输出如下:

print(MyFunctions.GET_USER.value)        # get_user
print(MyFunctions.GET_USER.function)     # get_user

print(MyFunctions.CREATE_POST.value)     # create_post
print(MyFunctions.CREATE_POST.function)  # create_new_post

print(MyFunctions.UPDATE_PROFILE.value)  # update_profile
print(MyFunctions.UPDATE_PROFILE.function) # update_user_profile

关键逻辑说明

  1. 重写__new__方法:这是处理auto()+自定义参数的核心,因为默认Enum只会在值为auto()且无额外参数时自动调用_generate_next_value_,带额外参数时需要手动触发。
  2. 获取枚举项名称:通过cls._member_names_按顺序获取当前枚举项的名称,确保_generate_next_value_能拿到正确的名称生成小写值。
  3. 灵活处理function属性:优先使用传入的自定义函数名,没有的话就默认用生成的小写名称,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Nick K9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:15:37