如何让Python枚举始终返回字符串类型的枚举值?
Python枚举(Enum)始终返回字符串值的解决方案
我使用Python 3.9.6,为提升代码可读性采用枚举(Enum)用于REST API输出,要求枚举输出必须为全大写字符串(如MON),即始终返回枚举的字符串类型值。我希望像示例#1那样直接使用枚举(如传递[Days.Mon]给函数),但当前输出的是枚举对象详情;示例#5、#6能得到正确输出,但用法繁琐。请问是否有方法让枚举始终返回字符串类型的枚举值?
原代码示例
from enum import Enum class Days(Enum): Mon = 'MON' def __str__(self): print( '*******' ) return f'{self.value}' # def __format__(self, spec): # return f'{self.value}' # 期望任何情况下始终返回枚举值的字符串类型 print( '1:' ) # 使用枚举 --> 输出不正确 print( [Days.Mon] ) print( '2:' ) # 强制调用__str__ print( f'{Days.Mon}' ) print( '3: ' ) # 此方式生效,因为调用了__str__ print( Days.Mon ) print( '4:' ) # 正确的字符串列表示例 print( ['Mon'] ) print( '5:' ) # 不想强制用户这么做 print( str([Days.Mon.value]) ) print( '6:' ) # 不想这么写 print( [f'{Days.Mon}'] )
原输出结果
1: [<Days.Mon: 'MON'>] 2: ******* MON 3: ******* MON 4: ['Mon'] 5: ['MON'] 6: ******* ['MON']
解决方案
方法一:让枚举类继承str和Enum
直接修改枚举类的继承关系,让它同时继承str和Enum,这样枚举成员本质上是字符串的子类,任何场景下都会直接输出其字符串值,无需额外调用方法:
from enum import Enum class Days(str, Enum): Mon = 'MON' # 测试输出 print('1:') print([Days.Mon]) # 输出 ['MON'] print('2:') print(f'{Days.Mon}') # 输出 MON print('3:') print(Days.Mon) # 输出 MON
这种方式完全符合需求,直接使用[Days.Mon]就能得到正确的字符串列表,无需繁琐的.value或格式化操作。
方法二:自定义JSON编码器(适配REST API场景)
如果枚举主要用于REST API的JSON输出,可以自定义JSON编码器,自动将枚举对象转换为对应的值,避免手动处理:
import json from enum import Enum class Days(Enum): Mon = 'MON' class EnumEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Enum): return obj.value return super().default(obj) # 测试JSON序列化 print(json.dumps([Days.Mon], cls=EnumEncoder)) # 输出 ["MON"]
在使用Flask、Django等框架时,可以将这个编码器配置为全局默认的JSON编码器,返回响应时会自动处理枚举类型。
内容的提问来源于stack exchange,提问作者Keith
相关产品推荐
相关产品推荐

