Mypy对普通变量与TypedDict的类型推断行为差异原因咨询
为什么Mypy无法识别TypedDict键赋值后的非None类型?
Mypy对普通变量和TypedDict的类型处理逻辑存在差异,核心原因如下:
普通变量是可精准跟踪的单一绑定对象:当你给
myvar赋值42后,Mypy能直接将其类型从Optional[int]更新为int,后续代码里自然能识别它不为None。这是因为变量的生命周期中,Mypy可以精准追踪每一次赋值带来的类型变化。TypedDict是结构契约,而非动态类型跟踪工具:TypedDict的作用是定义字典的键值类型规范,它描述的是这个字典允许包含的键、每个键的类型范围,而非跟踪单个键的实时值类型。哪怕你给
mydict1['mykey']赋值了42,Mypy依然会认为这个键符合最初定义的Optional[int]类型——因为TypedDict不负责记录字典内部单个键的动态赋值变化。可变容器的不确定性限制:字典是可变对象,你给
mykey赋值42后,完全有可能在其他代码分支把它改回None。Mypy无法确保后续访问mydict1['mykey']时的值一定是int,所以不会自动窄化类型。
解决办法
要让Mypy认可mykey的非None类型,需要显式添加类型检查:
from typing import Optional, TypedDict class MyDictType(TypedDict): mykey: Optional[int] mydict1: MyDictType = {'mykey': None} mydict1['mykey'] = 42 # 先检查非None,Mypy会自动窄化类型 if mydict1['mykey'] is not None and mydict1['mykey'] < 1: print("Error")
或者把键值提取到普通变量中,利用Mypy对变量的类型跟踪能力:
my_val = mydict1['mykey'] if my_val is not None and my_val < 1: print("Error")
内容的提问来源于stack exchange,提问作者Quincy
相关产品推荐
相关产品推荐

