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
相关产品推荐
相关产品推荐

