我通过pyright 使用严格的类型检查。
当我有一个返回 pytorch 的方法时DataLoader
,然后 Pyright 抱怨我的类型定义:
声明的返回类型“DataLoader[Unknown]”部分未知
Pyright(报告未知变量类型)
查看 pytorch 的类型存根DataLoader
(精简到重要部分):
class DataLoader(Generic[T_co]):
dataset: Dataset[T_co]
@overload
def __init__(self, dataset: Dataset[T_co], ...
据我所知,泛型类型T_co
of the DataLoader
应由以下定义__init__
数据集参数。
Pyright 也抱怨我的Dataset
类型定义:
参数“数据集”的类型部分未知
参数类型为“数据集[未知]”
Pyright(报告未知参数类型)
看看Dataset
类型存根:
class Dataset(Generic[T_co]):
def __getitem__(self, index: int) -> T_co: ...
向我表明该类型应该由返回类型推断__getitem__
.
我的数据集的类型签名__getitem__
看起来像这样:
def __getitem__(self, index: int) -> Tuple[Tensor, Tensor]:
基于此我期望Dataset
and DataLoader
可以推断为Dataset[Tuple[Tensor, Tensor]]
and DataLoader[Tuple[Tensor, Tensor]]
但事实并非如此。
我的猜测是 Pyright 无法静态推断这里的类型。
我想我可以像这样定义自己的类型签名:
Dataset[Tuple[Tensor, Tensor]]
但这实际上导致我的 python 脚本崩溃:
类型错误:“类型”对象不可下标
我怎样才能正确定义类型Dataset
and DataLoader
?