我有一个类
Foobar
,有几个子类,比如FoobarAlpha
和FoobarBeta
我知道如何定义一个类型
AnyFoobar = TypeVar("AnyFoobar", bound=Foobar)
来匹配 Foobar
的任何子类。
但是,如何定义也匹配
AnyFoobars
子类并集的类型 Foobar
?例如,匹配 FoobarAlpha
、FoobarBeta
和 typing.Union[FoobarAlpha, FoobarBeta]
? 的类型
@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
替换为注释掉的声明以获得相同的结果。