使用Python 3.8与mypy 1.4.1时多返回值赋值引发类型警告问题
解决mypy解构赋值字典时的类型警告
问题场景
使用Python 3.8和mypy 1.4.1时,执行如下代码会触发类型警告:
Expected type 'Dict[str, float]', got 'Dict[str, Tuple[float, float, float]]' instead
代码示例:
from typing import Dict, Tuple def foo() -> Tuple[float, float, float]: return 1, 3, 5 a: Dict[str, float] = {} a["asdf"], _, _ = foo()
问题原因
mypy对解构赋值的语法解析存在优先级判断偏差,它错误地将a["asdf"]识别为接收整个元组的目标,而非解构后的单个float元素,因此判定字典a的类型不符合声明。
解决方案
有两种简单的修复方式:
方式1:先解构元组再赋值
先将函数返回的元组解构到临时变量,再将目标元素赋值给字典:
from typing import Dict, Tuple def foo() -> Tuple[float, float, float]: return 1, 3, 5 a: Dict[str, float] = {} val, _, _ = foo() a["asdf"] = val
方式2:用括号明确解构优先级
给整个解构赋值表达式加上括号,明确告诉mypy这是解构操作:
from typing import Dict, Tuple def foo() -> Tuple[float, float, float]: return 1, 3, 5 a: Dict[str, float] = {} (a["asdf"], _, _) = foo()
内容的提问来源于stack exchange,提问作者chuckyoungblood
相关产品推荐
相关产品推荐

