首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类型错误:赋值中不兼容的类型(表达式类型为"Dict[<nothing>,<nothing>]",目标类型为"List[str]")

类型错误:赋值中不兼容的类型(表达式类型为"Dict[<nothing>,<nothing>]",目标类型为"List[str]")
EN

Stack Overflow用户
提问于 2021-08-16 13:18:50
回答 1查看 3.4K关注 0票数 2

我试图在现有dict的第二级实例化一个空字典,然后给它分配一个键值对,但是MyPy会抛出一个错误。

下面是一个最小的示例,它将在激活MyPy检查时再现它:

代码语言:javascript
运行
复制
result = {"Test": "something"}
result['key'] = {}
result['key']['sub_key'] = ["some string", "another string"]

这里的错误如下:

代码语言:javascript
运行
复制
mypy(error): Incompatible types in assignment (expression has type
"Dict[<nothing>, <nothing>]", target has type "List[str]")

如何防止此错误?根据similar problem的说法,建议这样做

代码语言:javascript
运行
复制
result['key'] = {}  # type: ignore

作为一个解决办法,但这似乎不太优雅,这就是为什么我想知道是否有更多的人可以做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-16 18:27:54

问题所在

好的,让我们来看看前两行。

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

代码语言:javascript
运行
复制
result = {"Test": "something"}

您不需要声明期望result的键和值有哪些类型,所以留给MyPy自己来计算。好的,它说,我可以这样做--只有字符串作为字典键,只有字符串作为字典值,因此result必须是dict[str, str]类型。

然后我们到达第2行:

代码语言:javascript
运行
复制
result['key'] = {}

MyPy相当合理地提出了一个错误。“嘿,这看起来是个错误!”上面写着。到目前为止,您只有字符串作为字典值,而且您还没有明确地告诉MyPy,在本词典中使用非str值是可以的,因此MyPy估计您在这里可能犯了错误,并不打算将该值添加到字典中。

没有必要看第三行,因为这基本上是一回事

怎么解决这个问题?

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

  1. ,您可以告诉MyPy,这个特定的字典具有与特定字符串键相关联的特定类型,方法是将它注释为TypedDict。(但是,您必须将"sub-key"键更改为"sub_key",因为“子键”不是有效的变量名。)

输入TypedDict类KeyDict(TypedDict,total=False):sub_key: liststr class ResultDict(TypedDict,total=False):Test: str key: KeyDict结果: ResultDict = {"Test":“typing”} result'key‘= {} result'key’=“something”,“total=False”

  1. 您可以告诉MyPy,本词典中的任何值都可以是str类型,也可以是dict[str, list[str]]类型:

键入导入联合结果: dict[str,Union[str,dict[str,liststr] ]= {"Test":“某事”} d: dict[str,liststr]= {} d‘’sub_key‘=“something”,“另一个字符串”结果’key‘= d

  1. ,您可以告诉MyPy,该字典中的值可以是任何值(与关闭类型检查器没有多大区别):

从输入任何结果: dictstr,Any = {"Test":“某事”}结果‘’key‘= {}结果’‘key’=“something”,“另一个字符串”

  1. 您可以关闭类型检查器:

结果‘’key‘= {} #类型:不考虑重新分配结果’‘key’=“一些字符串”,“另一个字符串”#类型:

无论如何,如果不了解更多关于用例的知识,就很难知道这里的“最佳”解决方案是什么。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68803511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档