如何用Pyright为返回泛型数据类实例列表的方法做类型提示?
让Pyright推断
get_bars返回联合类型列表的解决方案 要实现你期望的类型推断,需要给Foo类添加合适的泛型标注,让Pyright能够捕获Bar实例的联合类型。以下是具体实现步骤:
1. 修正泛型类型标注
首先,为Foo定义一个泛型类型变量,用来表示bars列表中Bar实例的联合类型。具体代码如下:
from dataclasses import dataclass from typing import TypeVar, List # 定义Bar的泛型参数 T = TypeVar('T') @dataclass class Bar[T]: a: T # 定义Foo的泛型参数,约束为Bar的任意实例(可选但更严谨) U = TypeVar('U', bound=Bar[object]) @dataclass class Foo[U]: bars: List[U] def get_bars(self) -> List[U]: return self.bars
2. 验证类型推断
当你创建包含不同Bar实例的Foo对象时,Pyright会自动推断出get_bars的返回类型为对应Bar实例的联合类型列表:
foo = Foo(bars=[Bar[int](a=1), Bar[str](a='bar')]) foo.get_bars() # Pyright将推断为 list[Bar[int] | Bar[str]]
关键说明
- 原代码中
Foo的bars标注为list[Bar]是不规范的,因为Bar是泛型类,必须绑定具体的类型参数或通过泛型变量间接约束。 - 通过为
Foo定义泛型参数U,Pyright可以自动捕获传入bars列表的所有Bar实例类型,并将它们合并为联合类型,最终让get_bars返回正确的类型。
内容的提问来源于stack exchange,提问作者Orelus
相关产品推荐
相关产品推荐

