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

Python中数据类实例化后枚举字段值转为字符串的问题

解决Dataclass枚举字段自动转换问题

默认情况下,Python数据类不会自动将字符串/数字类型的输入转换为对应的枚举成员,只会直接赋值,所以才会出现Message(status='1')的结果。以下是几种可行的解决方法:

方法1:手动转换字典值

在解包字典创建实例前,手动将字符串转换为枚举成员:

from dataclasses import dataclass
from enum import Enum

class Statuses(Enum):
    SEND = 1
    ACK = 2
    NACK = 3

@dataclass
class Message:
    status: Statuses

some_dict = {"status":"1"}
# 将字符串转为int后,再映射为枚举成员
some_dict["status"] = Statuses(int(some_dict["status"]))
instance = Message(**some_dict)
print(instance)  # 输出:Message(status=<Statuses.SEND: 1>)

方法2:通过__post_init__自动转换

在数据类中添加__post_init__方法,初始化完成后自动处理字段类型转换,无需手动修改字典:

from dataclasses import dataclass
from enum import Enum

class Statuses(Enum):
    SEND = 1
    ACK = 2
    NACK = 3

@dataclass
class Message:
    status: Statuses

    def __post_init__(self):
        # 若status不是枚举成员,尝试转换
        if not isinstance(self.status, Statuses):
            # 先转int(因为枚举值是整数类型),再获取枚举成员
            self.status = Statuses(int(self.status))

some_dict = {"status":"1"}
instance = Message(**some_dict)
print(instance)  # 输出:Message(status=<Statuses.SEND: 1>)

补充说明

Python数据类的类型注解仅用于提示,默认不会触发自动类型转换。如果需要更严格的类型校验和自动转换,可以考虑使用pydantic这类专门的库,但上述方法基于原生Python即可解决问题。

内容的提问来源于stack exchange,提问作者Alireza Delkhahi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:42:44