如何为继承两个特定类的Python对象提供精准类型提示?
正确的类型提示写法分析
首先明确需求:foo需要接受同时继承BaseClass1和BaseClass2的类的实例(比如MyClass1、MyClass2的对象)。
你的两种写法问题分析
第一种写法:
T = type[BaseClass1] & type[BaseClass2]
这个定义的是类对象的类型(比如BaseClass1、MyClass1这些类本身),而不是实例类型。如果用它标注foo的参数,传入i1(实例)会触发类型检查错误,因为实例不是类对象,完全不符合需求。第二种写法:
T = TypeVar("I18nField", bound= BaseClass1 | BaseClass2)
这个TypeVar的边界是BaseClass1或BaseClass2的子类,意味着只继承其中一个基类的实例(比如class OnlyBase1(BaseClass1): pass的对象)也能传入foo,范围太宽,不符合你只接受同时继承两个基类实例的需求。
正确的写法
直接用实例交集类型
最直接精准的写法是使用实例的交集类型BaseClass1 & BaseClass2,因为MyClass1和MyClass2的实例同时属于这两个基类的实例:
class BaseClass1: pass class BaseClass2: pass class MyClass1(BaseClass1, BaseClass2): pass class MyClass2(BaseClass1, BaseClass2): pass def foo(ins: BaseClass1 & BaseClass2): pass i1 = MyClass1() i2 = MyClass2() foo(i1) # 类型检查通过 foo(i2) # 类型检查通过
复用类型别名(可选)
如果这个类型需要多处使用,可以用TypeAlias定义别名:
from typing import TypeAlias class BaseClass1: pass class BaseClass2: pass MyCombinedType: TypeAlias = BaseClass1 & BaseClass2 class MyClass1(BaseClass1, BaseClass2): pass class MyClass2(BaseClass1, BaseClass2): pass def foo(ins: MyCombinedType): pass
这样写既能准确限制传入的实例必须同时是两个基类的子类实例,又能通过类型检查工具(比如mypy、pyright)的验证。
内容的提问来源于stack exchange,提问作者VictorM
相关产品推荐
相关产品推荐

