dict 的 dict 上的 Mypy 错误:“object”类型的值不可索引

2024-01-05

我有以下关于 python 的字典:

dictionary = {
    'key1': 1,
    'sub_dict': {'key2': 0},
}

当我在以下行运行 mypy 时:

print(dictionary['sub_dict']['key2'])

它会引发错误Value of type "object" is not indexable


静态类型很棘手。mypy可以确定的值dictionary并非都具有相同的类型,但仅此而已。这static类型dictionary is Dict[str,object],基于初始值。然而,mypy不会尝试进一步模拟代码,这意味着它不知道是否d['sub_dict'] is still其他dict在您尝试对其进行索引的位置key2,这会导致类型错误。

你能做的一件事就是提供帮助mypy通过告诉它一个特定的值可以被视为具有特定的类型,使用typing.cast.

print(typing.cast(typing.Dict[str,dict], d['sub_dict'])['key2'])

在运行时,typing.cast实际上是一个恒等函数;它只返回第二个参数。mypy将其视为更强的类型提示,表示无论之前的任何提示或注释如何,d['sub_dict']应被视为Dict[str,dict].

但请注意,通过使用cast,你正在告诉mypy that you正在承担责任以确保dictionary['sub_dict']事实上,是一个dict在运行时,因为这不是可以用静态类型传达的东西。你可能会认为类似

dictionary : Dict[str,Union[int,dict]] = ...

会起作用,但这只是说明mypy写起来会出现类型错误dictionary['foo'] = 'bar', since 'bar'既不是int or a dict。即使有更准确的类型提示,仍然没有办法mypy知道什么类型的值dictionary将任何特定键映射到。

你可以使用Any还有:

dictionary: Dict[str,Any] = ...

因为现在你说任何类型都可以用作值,并且any可以为索引结果假定类型,并且这两种类型不必对齐。那是,dictionary['key1'] = 3很好,因为int兼容于Any, but dictionary['sub_dict']['key2']也很好,因为无论如何dictionary['sub_dict']产生的是also兼容于Any,并且您可以假设该类型本身是可索引的。实际上,它涵盖了any use of dictionary代码中的任何位置,而不是您使用的特定位置cast就应该允许什么做出断言。


主要题外话:有一个概念依赖类型,最简单的例子是这样的类型PositiveInt这将等同于int除非它不允许负值。dictionary似乎具有类似的依赖类型,其中值的类型实际上是存储在值中的实际数据的函数。例如,想象一下如果您可以使用instance of dict with Dict指定其值的类型。

dictionary: Dict[str, {"key1": int, "sub_dict": dict}] = {'key1': 1,
          'sub_dict': {'key2': 0}
         }

现在,不仅可以mypy告诉那dictionary['key1']应该是一个int,但是那个dictionary本身永远不可能有任何钥匙other than key1 and sub_dict。 (在这个假设的世界中,defaultdict可以将任意未指定的键映射到默认类型。)

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

dict 的 dict 上的 Mypy 错误:“object”类型的值不可索引 的相关文章

随机推荐

  • IN 关键字的 Spring Data JPA hibernate 集合

    我正在尝试使用 Spring 数据存储库中的自定义查询来获取记录 我想使用 IN 关键字根据嵌套对象的 id 来获取对象 以下是我的回购课程 public interface BusinessRepository extends JpaRe
  • Android 应用程序上出现 DeadObjectException

    有时我会开始一个Activity我的应用程序 或之间快速切换Fragments of a ViewPager这是在那个特定的Activity I got DeadObjectException像这样 W ActivityManager 66
  • scipy 中最小二乘函数雅可比行列式的方法签名

    任何人都可以提供一个向 a 提供雅可比行列式的示例吗 最小二乘函数 http docs scipy org doc scipy reference generated scipy optimize leastsq html scipy op
  • 在php中从另一个数组创建一个数组[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个看起来像这样的数组 这是一个二维数组 MainArray Array 0 gt Array Job Name gt WXYZ Qua
  • 如何将同名文件上传到Amazon S3并覆盖现有文件?

    s3 putObject Bucket bucketName Key fileName Body file ACL bucket owner full control function err data if err console log
  • setOnCheckedChangeListener 参数

    RadioGroup radioGroup RadioGroup findViewById R id orientation radioGroup setOnCheckedChangeListener new RadioGroup OnCh
  • Proguard minifyEnabled 对于调试构建为 true,不适用于 Lollipop 之前的版本

    我的应用程序的方法计数高于 64k 限制 因此我使用 Proguard 来减少它 发布版本一切正常 另一方面 调试版本仅对 Lollipop 设备成功 在棒棒糖之前的设备上启动时 我总是遇到臭名昭著的错误 com android dex D
  • PHP MySQL 查询不插入

    我在尝试将查询插入数据库时 遇到一些问题 我有这个 php 表单 应该执行插入查询 但没有任何反应 甚至没有错误 这是一个具有以下形式的示例查询 INSERT INTO FlashVideoList title urltitle descr
  • dompdf内存问题

    我正在使用 DOMPDF 从一个脚本生成大约 500 份报告 生成大约 10 15 个 PDF 后 内存不足 在调试中 看起来每次加载字体时都会加载 8M 但这似乎应该用字体缓存代码来处理 对这里出了什么问题有什么想法吗 我想发布一个简单的
  • Angular2:可观察内部的变化检测

    只是我用 Angular2 RC3 使用 Angular CLI 尝试了我的第一个应用程序 但我对此迷失了 我对变量的 更改检测 有疑问word 我更新了word里面的变量subscribeObservable 的方法 但没有检测到任何变化
  • Jackson JsonNode 到类型化集合

    转换杰克逊的正确方法是什么JsonNode到java集合 如果它是一个 json 字符串我可以使用ObjectMapper readValue String TypeReference 但对于一个JsonNode唯一的选择是ObjectMa
  • 将表单放置在单击的通知图标上方

    有没有办法将窗体放置在 Windows 7 和 Windows Vista 中单击的 通知 图标上方 这是一个更简单的方法 当 OnClick 事件触发时 您可以获取鼠标的 X Y 位置 您还可以通过这些对象的一些检查来获取任务栏位置Scr
  • 如何在字符串中使用 contains 和 equalsIgnoreCase

    有没有办法检查字符串是否包含某些内容而不区分大小写 例如 此代码无效 只是为了让您对我的问题有一个基本的了解 String text I love ponies if text contains equalsIgnoreCase love
  • python selenium 代码将文本保存在剪贴板中的变量中,通过单击元素将文本复制到剪贴板

    在我的网页上有一个窗口 如下图所示 它有一个显示密码的部分 当我单击 复制 元素时 它将密码复制到剪贴板 然而 该窗口将在 30 秒内关闭 然后剪贴板上复制的密码将丢失 我的目的是将复制到剪贴板上的密码保存到一个变量中 以便在我的 pyth
  • 阻止发送 Laravel 通知

    我正在开发一个功能来发送 级联 或一系列通知 https laravel com docs 5 8 notifications不同频道之间存在延迟 例如 电子邮件 gt 30 分钟后 gt 推送 gt 30 分钟后 gt 短信 该流程运行良
  • WAMP登录系统

    我将一堆以前在不同网站上运行的网站文件转移到WAMP 一切正常 但现在自从我将其转移到WAMP后 一些登录php的东西根本不起作用 这session destroy 东西根本不起作用 我试过了session unset 也 我在 WAMP
  • SQL Server IN(选择)导致不终止查询

    我已将问题缩小到最小的示例 我应该在要运行的实际查询中为顶层选择更多列 Query SELECT AspNetUsers Id FROM Trade US PC INNER JOIN AspNetUsers ON Trade US PC T
  • HTML5 拖放不适用于 IE11

    应用了 HTML5 原生拖放 拖放不适用于 IE 但适用于 chrome 和 firefox 拖动似乎有效 但在 ICE 上没有发生拖放 另一个小问题 在 IE 中 我的可拖动元素周围有一个半透明的正方形 但它的背景是透明的 图像是这样完成
  • 未捕获的 DOMException:无法在“WorkerGlobalScope”上执行“importScripts”

    我正在尝试从中导入脚本 importScripts https www gstatic com firebasejs 9 1 0 firebase app js importScripts https www gstatic com fir
  • dict 的 dict 上的 Mypy 错误:“object”类型的值不可索引

    我有以下关于 python 的字典 dictionary key1 1 sub dict key2 0 当我在以下行运行 mypy 时 print dictionary sub dict key2 它会引发错误Value of type o