如何在Python中将类型约束为子类的联合?

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

我有一个类

Foobar
,有几个子类,比如
FoobarAlpha
FoobarBeta

我知道如何定义一个类型

AnyFoobar = TypeVar("AnyFoobar", bound=Foobar)
来匹配
Foobar
的任何子类。

但是,如何定义也匹配

AnyFoobars
子类并集的类型
Foobar
?例如,匹配
FoobarAlpha
FoobarBeta
typing.Union[FoobarAlpha, FoobarBeta]

的类型
python mypy python-typing
1个回答
0
投票

@user3840170 和 @STerliakov 在有关

Foobar
完成您需要的内容的评论中是正确的。同样,
AnyFoobar = TypeVar("AnyFoobar", bound=Foobar)
已经足以满足您的要求。

这是因为从类型提示的角度来看,

typing.Union[FoobarAlpha, FoobarBeta]
(更改为
FoobarAlpha | FoobarBeta
的现代语法)实际上是
Foobar
的子类。

一个重要的注意事项是运行时是一个不同的故事。

issubclass(FoobarAlpha | FoobarBeta, Foobar)
引发
TypeError
,因为
FoobarAlpha | FoobarBeta
实际上不是运行时类。然而,对于类型检查器来说
FoobarAlpha | FoobarBeta
Foobar
一样都是
FoobarAlpha
子类。

请参阅 this mypy Playground,了解如何将

AnyFoobars
分配给您设置的
AnyFoobar
来完成您需要的内容。如果联合边界在概念上更容易理解,您可以将
AnyFoobars
替换为注释掉的声明以获得相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.