我试图在现有dict的第二级实例化一个空字典,然后给它分配一个键值对,但是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]")
如何防止此错误?根据similar problem的说法,建议这样做
result['key'] = {} # type: ignore
作为一个解决办法,但这似乎不太优雅,这就是为什么我想知道是否有更多的人可以做。
发布于 2021-08-16 18:27:54
问题所在
好的,让我们来看看前两行。
首先,定义字典result
。你这样定义它:
result = {"Test": "something"}
您不需要声明期望result
的键和值有哪些类型,所以留给MyPy自己来计算。好的,它说,我可以这样做--只有字符串作为字典键,只有字符串作为字典值,因此result
必须是dict[str, str]
类型。
然后我们到达第2行:
result['key'] = {}
MyPy相当合理地提出了一个错误。“嘿,这看起来是个错误!”上面写着。到目前为止,您只有字符串作为字典值,而且您还没有明确地告诉MyPy,在本词典中使用非str
值是可以的,因此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”
str
类型,也可以是dict[str, list[str]]
类型:键入导入联合结果: dict[str,Union[str,dict[str,liststr] ]= {"Test":“某事”} d: dict[str,liststr]= {} d‘’sub_key‘=“something”,“另一个字符串”结果’key‘= d
从输入任何结果: dictstr,Any = {"Test":“某事”}结果‘’key‘= {}结果’‘key’=“something”,“另一个字符串”
结果‘’key‘= {} #类型:不考虑重新分配结果’‘key’=“一些字符串”,“另一个字符串”#类型:
无论如何,如果不了解更多关于用例的知识,就很难知道这里的“最佳”解决方案是什么。
https://stackoverflow.com/questions/68803511
复制相似问题