使用mypy 0.942时遇到变量赋值类型不兼容错误求助
错误原因分析
尝试1的错误根源
你声明price_point为Optional[str]类型,mypy会严格遵循变量的类型契约——这个变量只能存储str或None值。当你把List[str]类型的列表赋值给它时,类型完全不兼容,因此触发赋值类型不匹配的错误。
尝试2的错误根源
你应该是给新变量price_point_input标注了List[str]类型,但初始赋值的price_point是Optional[str]类型,把可选字符串赋值给列表类型的变量,违反了类型约束,导致mypy报错。
替代解决方案
以下是几种可行的解决方式,均能通过mypy类型检查:
方案1:匹配函数参数类型声明新变量
直接将新变量的类型标注为和_other_func参数一致的Optional[Union[List[str], str]],这样它既可以接收原有的可选字符串,也能接收处理后的列表:
from typing import Optional, Union, List def _other_func(price: Optional[Union[List[str], str]]) -> None: pass price_point: Optional[str] = "low-high" # 声明变量类型与函数参数匹配 price_point_input: Optional[Union[List[str], str]] = price_point if price_point and "-" in price_point: price_point_input = price_point.split("-") _other_func(price_point_input)
方案2:直接在函数调用前处理(无额外变量)
无需声明新变量,直接在调用时生成符合类型要求的表达式,mypy会自动推断其类型:
from typing import Optional, Union, List def _other_func(price: Optional[Union[List[str], str]]) -> None: pass price_point: Optional[str] = "low-high" # 直接生成符合类型的参数传入 processed_price = price_point.split("-") if (price_point and "-" in price_point) else price_point _other_func(processed_price)
方案3:分支内直接传递处理后的值
利用mypy的分支类型推断能力,在不同分支中传递对应类型的值,无需额外变量:
from typing import Optional, Union, List def _other_func(price: Optional[Union[List[str], str]]) -> None: pass price_point: Optional[str] = "low-high" if price_point and "-" in price_point: _other_func(price_point.split("-")) else: _other_func(price_point)
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

