mypy 错误:赋值中的类型不兼容(表达式的类型为“Dict[, ]”,目标的类型为“List[str]”)

2024-05-03

我尝试过了实例化一个空字典在现有字典的第二层上,然后为其分配一个键值对,但 MyPy 会抛出错误。

这是一个最小的示例,当激活 MyPy 检查时它将重现它:

result = {"Test": "something"}
result['key'] = {}
result['key']['sub_key'] = ["some string", "another string"]

这里的错误将类似于:

mypy(error): Incompatible types in assignment (expression has type
"Dict[<nothing>, <nothing>]", target has type "List[str]")

我该如何防止这个错误? 根据一个类似的问题 https://stackoverflow.com/questions/58906541/incompatible-types-in-assignment-expression-has-type-listnothing-variabl,建议这样做

result['key'] = {}  # type: ignore

作为一种解决方法,但这似乎不是很优雅,这就是为什么我想知道是否还有更多的事情可以做。


问题

好的,让我们看看这里的前两行。

首先,定义你的字典result。你这样定义它:

result = {"Test": "something"}

您没有声明您期望的键和值的类型result必须有,所以 MyPy 需要自己解决这个问题。好吧,它说,我可以做到这一点 - 你只有字符串作为字典键,也只有字符串作为字典值,因此result必须是类型dict[str, str].

然后我们进入第 2 行:

result['key'] = {}

MyPy 很合理地引发了错误。 “嘿嘿,这看起来像是一个错误!”它说。到目前为止,您只将字符串作为字典值,并且您还没有明确告诉 MyPy 可以使用非str该字典中的值,因此 MyPy 认为您可能在这里犯了错误,并且无意将该值添加到字典中。

没有必要看第三行,因为它基本上是同样的事情

如何解决这个问题?

有几种方法可以解决这个问题。按照最首选(如果可能的话使用)到最不首选(仅作为最后手段使用)的顺序:

  1. 你可以告诉 MyPy这个具体的字典具有与某些字符串键关联的某些类型,通过将其注释为TypedDict。 (你必须改变你的"sub-key" key to "sub_key"但是,因为“子键”不是有效的变量名称。)

    from typing import TypedDict
    
    class KeyDict(TypedDict, total=False):
        sub_key: list[str]
    
    
    class ResultDict(TypedDict, total=False):
        Test: str
        key: KeyDict
    
    
    result: ResultDict = {"Test": "something"}
    result['key'] = {}
    result['key']['sub_key'] = ["some string", "another string"]
    
  2. 你可以告诉 MyPyany该字典中的值可以是类型str,或者它可能是类型dict[str, list[str]]:

    from typing import Union
    
    result: dict[str, Union[str, dict[str, list[str]]]] = {"Test": "something"}
    d: dict[str, list[str]] = {}
    d['sub_key'] = ["some string", "another string"]
    result['key'] = d
    
  3. 你可以告诉 MyPy 这个字典中的值可以是anything(与关闭类型检查器没有什么不同):

    from typing import Any
    
    result: dict[str, Any] = {"Test": "something"}
    result['key'] = {}
    result['key']['sub_key'] = ["some string", "another string"]
    
  4. 您可以关闭类型检查器:

    result = {"Test": "something"}  
    result['key'] = {}  # type: ignore[assignment]
    result['key']['sub_key'] = ["some string", "another string"] # type: ignore[index]
    

无论如何,如果不了解更多有关您的用例的信息,就很难知道“最佳”解决方案是什么。

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

mypy 错误:赋值中的类型不兼容(表达式的类型为“Dict[, ]”,目标的类型为“List[str]”) 的相关文章

随机推荐

  • 解释为什么没有船的空 scenekit 场景只有一个节点和 2.73K 多边形

    为什么移除船舶后的空 scenekit 场景只有一个节点和 2 73K 多边形数 如果我展开统计视图 会看到两个节点和 5 46K 个多边形 它必须与统计视图有关 但为什么有这么多多边形 为什么这个视图会出现在场景内部 一个空的 Scene
  • 如何在特定时间启动Tornado周期性回调?

    目前在我的 Tornado 应用程序中 我正在使用定期调用回调PeriodicCallback每隔一小时 像这样 import tornado ioloop from tornado ioloop import PeriodicCallba
  • 将视图控制器推送到 UINavigationController 中

    我有一个带有导航控制器的选项卡视图控制器 在第一个选项卡项中 我单击视图中的按钮 弹出一个带有动画的视图 是 然后 当该视图完成后 我点击另一个按钮将其关闭 喜欢 self dismissViewControllerAnimated NO
  • tikz:为节点设置适当的x值

    这个问题源于这个问题here https stackoverflow com questions 2772972 latex curly braces outside math 我想生成一个跨越一些文本行的大括号 问题是我必须手动对齐 x
  • 如何将 typedef 结构传递给函数?

    此刻我正在努力 void avg everything 但这给了我错误 error subscripted value is neither array nor pointer 当我今天早些时候收到此错误时 这是 因为我没有正确地将 2D
  • 使用 PuLP 进行线性优化,变量附加条件

    我必须用 Pull 解决 Python 中的整数线性优化问题 我解决了基本问题 现在我必须添加额外的约束 有人可以帮助我用逻辑指示器添加条件吗 逻辑限制是 如果 A gt 20 则 B gt 5 这是我的代码 from pulp impor
  • 用于从多个目录复制和重命名文件的批处理文件

    我之前曾寻找过我的问题的答案 但到目前为止还没有具体的答案 看 使用xcopy将多个目录中的文件复制到一个目录 https stackoverflow com questions 585091 using xcopy to copy fil
  • OpenMP 动态调度与引导调度

    我正在研究 OpenMP 的调度 特别是不同的类型 我了解每种类型的一般行为 但澄清一下何时进行选择会很有帮助dynamic and guided调度 英特尔的文档 https software intel com en us articl
  • 如何将多个矩形打包为 2d 盒子俄罗斯方块样式

    我有许多不同宽度和高度的矩形 我有一个更大的矩形平台来放置它们 我想将它们包装在平台的一侧 以便它们在纵向 X 尺寸上展开 但将横向 Y 尺寸保持在最小限度 就是把它们像俄罗斯方块游戏一样放置 不能有重叠 但可以有间隙 有没有算法可以做到这
  • C++ 头文件包含

    我正在开发一个项目 每个头文件都有一个预处理器包含防护 我的包含是这样的 文件 gt 包含 main cpp gt header h 字符 h header h gt 矢量 iostream DataFiles h Character h
  • Dojo 是否可以与其他 JS 框架结合?

    我们使用 Dojo 1 9 3 作为构建单页面应用程序的 JS 框架 然而 我们在 Dojo 的怪癖上花费了太多时间 因此即使是简单的任务也需要很长时间才能实现 由于缺乏适当的文档 我们经常不得不求助于阅读源代码 然后实施解决方法 我觉得如
  • 在 Monogame 和 UIKit 之间切换

    我一直在搜索和搜索 但似乎找不到适合我想做的事情的解决方案 而且我几乎已经到了不得不问它是否可能的地步 我正在使用 Xamarin Studio 开发 iOS 应用程序 我有几个不同的屏幕设置为 UIViewController 它们运行良
  • Python中如何实现相对导入

    考虑 stuff init py mylib py Foo init py main py foo init py script py script py想要进口mylib py 这只是一个示例 但实际上我只想在父目录中进行模块的相对导入
  • git推送失败:`拒绝更新签出的分支:refs/heads/master`

    我想将我对 JBoss 配置的本地修改存储在 git 中 为此 我设置了以下结构 lrwxrwxrwx 1 jboss jboss 19 Jan 24 11 53 current gt jboss as 7 1 0 CR1b drwxr x
  • Spring:在属性文件中定义@RequestMapping值

    是否可以定义a的值 RequestMapping在 Spring 中通过在属性文件中定义注释 实际上 我做了类似的事情 Controller RequestMapping xxx public class MyController 但我想存
  • GridView,在代码中添加标题行第 2 部分

    这是这篇文章的延续 但添加了完整的代码 ASP NET GridView 在代码中添加标题行 https stackoverflow com questions 19119004 asp net gridview adding header
  • 对 MFC UI 应用程序进行单元测试吗?

    如何对大型 MFC UI 应用程序进行单元测试 我们有一些大型 MFC 应用程序已经开发了很多年 我们使用一些标准的自动化 QA 工具来运行基本脚本来检查基础知识 文件打开等 这些由 QA 小组在日常构建后运行 但我们希望引入一些程序 以便
  • Web 服务无法使用 GAC 中的类型创建类型错误

    遇到一个不寻常的问题时 我似乎喜欢做一些不常见的事情 我有一个复合控件 它检查给定的 Web 服务文件是否存在于我的应用程序的根目录中 如果不存在 它会在标记中创建带有必要指令的文件以进行滚动 如下所示 反过来 它被保存到输出中 完成此步骤
  • 矩阵求逆 (3,3) python - 硬编码与 numpy.linalg.inv

    对于大量矩阵 我需要计算定义为的距离度量 尽管我确实知道强烈建议不要使用矩阵求逆 但我没有找到解决方法 因此 我尝试通过对矩阵求逆进行硬编码来提高性能 因为所有矩阵的大小均为 3 3 我预计这至少会是一个微小的改进 但事实并非如此 为什么
  • mypy 错误:赋值中的类型不兼容(表达式的类型为“Dict[, ]”,目标的类型为“List[str]”)

    我尝试过了实例化一个空字典在现有字典的第二层上 然后为其分配一个键值对 但 MyPy 会抛出错误 这是一个最小的示例 当激活 MyPy 检查时它将重现它 result Test something result key result key