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