输入只能采用枚举值的数据类

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 收到的字符串值进行初始化

che*_*ner 5

如果您确实想成为一个值,那么您的类输入正确。问题在于,作为实例化者,负责实际将类型值传递给。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它本身在设计时并没有考虑到静态类型检查。