如何解决来自pyright的“类型部分未知”警告?

2024-01-06

我通过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?


由于这个问题没有得到答复,我不确定这是否真的是pyright中的一个错误。因此我在 github 存储库上打开了这个问题:https://github.com/microsoft/pyright/issues/698 https://github.com/microsoft/pyright/issues/698

Eric Traut 详细解释了问题所在,并表示 Pyright 正在按设计运行。 我试图在这里给出要点的要点。

问题解释

如果未提供返回类型,Pyright 会尝试推断返回类型,但如果像本例一样提供了返回类型,则需要对它们进行完全类型化。 Pyright 不会填充给定类型注释的缺失部分。

例如,pyright 将尝试推断以下函数定义的返回类型:

def get_dataset():

但如果返回类型指定为Dataset那么这就是 Pyright 期望的返回类型。

def get_dataset() -> Dataset:

在这种情况下Dataset是一个通用类,不处理像这样的下标Dataset[int]。 在 Python 3.7(我们正在使用的)中,Python 解释器将评估这些类型注释,从而导致上述异常。

Solution

从 Python 3.10 开始,Python 解释器将不再评估类型注释,并且以下类型注释将起作用:

def get_dataset() -> Dataset[int]:

从 Python 3.7 开始,可以通过以下导入启用此行为:

from __future__ import annotations

这记录在PEP 563 https://www.python.org/dev/peps/pep-0563/。 您还需要禁用 pylint 的规则 E1136,以不发出有关“不可订阅对象”的警告。

另一种解决方法是引用类型定义,如下所示:

def get_dataset() -> "Dataset[int]":
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决来自pyright的“类型部分未知”警告? 的相关文章

  • 如何在 Django 管理中以表格格式显示添加模型?

    我刚刚开始使用 Django 编写我的第一个应用程序 为我的家庭设计的家务图表管理器 在本教程中 它向您展示了如何添加相关对象 http docs djangoproject com en dev intro tutorial02 cust
  • 创建圆形图像 PIL Tkinter

    Currently I have a zoom feature in my application that works very well however I d like the actual zoom box to be a circ
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 理解@property装饰器和继承[重复]

    这个问题在这里已经有答案了 这里是 Python 3 以防万一它很重要 我试图正确理解如何实现继承 property使用 我已经搜索了 StackOverflow 并阅读了大约 20 个类似的问题 但无济于事 因为他们试图解决的问题略有不同
  • 在ansible中合并字典

    我目前正在构建一个使用 ansible 安装 PHP 的角色 并且在合并字典时遇到一些困难 我尝试了多种方法来做到这一点 但我无法让它像我想要的那样工作 A vars file my default values key value my
  • 如何使用 python 操作系统更改驱动器?

    我正在尝试更改当前目录C to Y 我试过 import os os chdir Y 但我不断收到错误消息 提示无法找到驱动器 本质上我正在寻找相当于 cd d cmd 中的命令 你确定吗Y 确实是有效的驱动器号吗 Try os chdir
  • 如何在matplotlib中基于x轴更改直方图颜色

    我有根据 pandas 数据框计算出的直方图 我想根据 x 轴值更改颜色 例如 If the value is 0 the color should be green If the value is gt 0 the color shoul
  • Python 垃圾收集有时在 Jupyter Notebook 中不起作用

    我的一些 Jupyter 笔记本经常出现 RAM 不足的情况 而且我似乎无法释放不再需要的内存 这是一个例子 import gc thing Thing result thing do something thing None gc col
  • PyQt - 如何检查 QDialog 是否可见?

    我有个问题 我有这个代码 balls Ball for i in range 1 10 因此 当我说 Ball 时 这将在 QDialog 上绘制一个球 然后当这完成后 我正在移动球QDialog无限循环中 我想说类似的话while QDi
  • Flask SQLAlchemy 与 MyPy - 模型类型错误

    我遇到了以下组合问题flask sqlalchemy and mypy 当我定义一个新的 ORM 对象时 例如 class Foo db Model pass where db是使用创建的数据库SQL炼金术应用于flask app mypy
  • 在tensorflow .ckpt文件中使用预训练模型

    我有一个 ckpt 文件 我只想得到 cnn 的权重 我已经从 ckpt 检查点文件中进行了训练 inception resnet v2 2016 08 30 import tensorflow as tf saver tf train S
  • 请求response.iter_content()获取不完整的文件(1024MB而不是1.5GB)?

    您好 我一直在使用此代码片段从网站下载文件 到目前为止 小于 1GB 的文件都很好 但我注意到 1 5GB 文件不完整 s is requests session object r s get fileUrl headers headers
  • 如何使用数据库在 Django 中的应用程序之间交换数据?

    我正在使用 Django 在网络上工作 我创建了 2 个应用程序 第一个用于客户端注册并将其数据添加到数据库 第二个应用程序供用户访问和查看交互界面 这个想法是使用第二个应用程序从数据库中的客户端获取数据 并使用它向用户显示一些信息 我的问
  • 如何将 pytest 装置与 django TestCase 一起使用

    我如何在TestCase方法 类似问题的几个答案似乎暗示我的例子应该有效 import pytest from django test import TestCase from myapp models import Category py
  • django 组合对两个不同基本模型的查询

    我有两个不同的查询集 我想将两个查询集合并 q1 tbl nt 123 objects values list id value geometry filter restriction height exclude condition id
  • Jinja2中获取请求参数

    如何检索请求参数a在 Jinja2 模板中 http foo bar a 1 我这个答案有点晚了 但其他解决方案并没有真正考虑到您对 Flask 的使用 事实上 您将 Flask 与 Jinja2 一起使用 这使得您的情况与其他框架有点不同
  • 如何让你的精灵在pygame中跳跃

    目前我已经制作了一个平台游戏 可以左右移动我的角色 他从地上开始 关于如何让他跳的任何想法 因为我不明白 目前 如果我按住向上键 我的玩家精灵将连续向上移动 或者如果我按下它 我的玩家精灵将向上移动并保持向上 我想找个办法远离他 让我重新跌
  • 如何动态创建 Luigi 任务

    我正在为 Luigi Tasks 构建一个包装器 但遇到了一个障碍Register http luigi readthedocs io en stable modules luigi task register html Register该
  • 在Python中从列表中获取n个项目组的惯用方法? [复制]

    这个问题在这里已经有答案了 给定一个列表 A 1 2 3 4 5 6 是否有任何惯用的 Pythonic 方式来迭代它 就好像它是 B 1 2 3 4 5 6 除了索引之外 这感觉像是 C 的遗留物 for a1 a2 in A i A i
  • python中匹配3个或更多相同的字符

    我正在尝试使用正则表达式在字符串中查找三个或更多相同的字符 例如 你好 不匹配 噢 会的 我尝试过做类似的事情 re compile 1 3 a zA Z re compile w 1 5 但似乎都不起作用 w 1 2 是您正在寻找的正则表

随机推荐