Mig*_*ang 3 python enums typing python-typing
我有一个数据类,它可以采用枚举的一部分的值。
class MyEnum(Enum):
A = "valueA"
B = "valueB"
@dataclass
class MyDataclass:
value: MyEnum
Run Code Online (Sandbox Code Playgroud)
创建我的数据类时,类型不匹配,因为它正在考虑str!= MyEnum.A。
param = MyDataclass(value="valueA")
Run Code Online (Sandbox Code Playgroud)
MyDataclass关于如何输入有什么建议吗?
编辑:数据类正在使用我从另一个 API 收到的字符串值进行初始化
如果您确实想成为一个值,那么您的类输入正确。问题在于,作为实例化者,您负责实际将类型值传递给。MyDataclass().valueMyEnumMyDataclassMyEnum__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)
Run Code Online (Sandbox Code Playgroud)
自动转换将需要不同的库,例如 Pydantic 或(我相信)attrs;这不是一个dataclasses提供的功能。
这为您提供的静态类型保护量是有限的,因为您声明任何字符串都可以作为参数传递给__init__/ __post_init__,但实际上只有那些作为有效参数的字符串才是MyEnum有效的。这实际上并不是可以使用typing模块来表达的东西,因为Enum它本身在设计时并没有考虑到静态类型检查。