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]”) 的相关文章