我有一个数据类可以采用枚举的一部分的值。
class MyEnum(Enum):
A = "valueA"
B = "valueB"
@dataclass
class MyDataclass:
value: MyEnum
创建我的数据类时,类型不匹配,因为它正在考虑
str
!=MyEnum.A
.
param = MyDataclass(value="valueA")
关于应该如何输入
MyDataclass
的任何建议?
编辑:正在使用我从另一个 API 接收到的字符串值初始化数据类
如果您真的希望 MyDataclass().value
成为
MyEnum
值,则您的班级 typed是正确的。问题是 you 作为实例化
MyDataclass
的人,负责实际将 MyEnum
类型的值传递给 __init__
。
如果您的用例需要传递字符串,您必须自己在
__post_init__
中处理转换,这意味着稍微改变类定义。
from dataclasses import dataclass, InitVar, field
@dataclass
class MyDataclass:
value: MyEnum = field(init=False)
value_str: InitVar[str]
def __post_init__(self, value_str):
self.value = MyEnum(value_str)
自动转换将需要不同的库,例如 Pydantic 或(我相信)
attrs
;这不是dataclasses
提供的功能。
这给你的静态类型保护的数量是有限的,因为你说 any 字符串可以作为参数传递给
__init__
/__post_init__
,但实际上只有那些是 MyEnum
的有效参数有效。这并不是真正可以使用 typing
模块表达的东西,因为 Enum
本身在设计时并未考虑静态类型检查。
你可以这样做:
类 MyEnum(枚举): A: str = "现场直播" B: str = "上线"
@dataclass
class MyDataclass:
value: Enum = field(default=MyEnum)
print(asdict(MyDataclass(value=MyEnum.B)))