使用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
关键逻辑说明
- 重写
__new__方法:这是处理auto()+自定义参数的核心,因为默认Enum只会在值为auto()且无额外参数时自动调用_generate_next_value_,带额外参数时需要手动触发。 - 获取枚举项名称:通过
cls._member_names_按顺序获取当前枚举项的名称,确保_generate_next_value_能拿到正确的名称生成小写值。 - 灵活处理
function属性:优先使用传入的自定义函数名,没有的话就默认用生成的小写名称,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Nick K9
相关产品推荐
相关产品推荐

