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

问题描述 投票:0回答:2

我有一个数据类可以采用枚举的一部分的值。

class MyEnum(Enum):
    A = "valueA"
    B = "valueB"

@dataclass
class MyDataclass:
    value: MyEnum

创建我的数据类时,类型不匹配,因为它正在考虑

str
!=
MyEnum.A
.

param = MyDataclass(value="valueA")

关于应该如何输入

MyDataclass
的任何建议?

编辑:正在使用我从另一个 API 接收到的字符串值初始化数据类

python enums python-typing typing
2个回答
4
投票

如果您真的希望 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
本身在设计时并未考虑静态类型检查。


0
投票

你可以这样做:

类 MyEnum(枚举): A: str = "现场直播" B: str = "上线"

@dataclass
class MyDataclass:
    value: Enum = field(default=MyEnum)

print(asdict(MyDataclass(value=MyEnum.B)))
© www.soinside.com 2019 - 2024. All rights reserved.