【发布时间】:2021-12-28 22:37:24
【问题描述】:
class MessageType(Enum):
HELLO = 10
@dataclass(frozen=True)
class Message:
op: MessageType
@dataclass(frozen=True)
class Hello(Message):
op: MessageType.HELLO = field(init=False)
foo: str
Hello 是 Message 的一种类型,操作码为 10。我想将所有传入消息转换为子类消息,以便函数能够识别类型:def process_hello(msg: Hello): m.foo + 123 将无法通过类型检查,但如果我们使用通用的Message 类型。
op: MessageType.HELLO = field(init=False, default=MessageType.HELLO)
这似乎可行,但代价是冗余指定MessageType.HELLO,这意味着允许自定义操作值。有没有更多的 Python 方法来做到这一点?
【问题讨论】:
-
MessageType.HELLO不是类型;它是MessageType类型的值。 -
Pylance 没问题,类型显示为
Literal[MessageType.HELLO],好像正确? -
这可能是 Pylance 特有的行为;我不知道其他类型检查器是否会这样做。
-
至少,您可以具体并自己使用
Literal,而不是假设它会被推断出来。
标签: python enums typing python-dataclasses