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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:57:43