You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:40:16