为什么MyPy报赋值类型不兼容错误:if/else报错但三元表达式正常
问题原因
这是MyPy的变量类型推断规则差异导致的:
- 使用if/else分支赋值时,MyPy会按代码执行顺序先处理第一个赋值分支:在
if config_path分支里给read_cols赋值为List[str]类型的返回值,MyPy此时会直接把read_cols的类型推断为List[str],后续在else分支给它赋值None时,就会触发类型不匹配的报错。 - 而三元表达式是作为一个完整的赋值表达式处理的,MyPy会同时计算两个分支的返回类型,自动将整个表达式的类型推断为
Optional[List[str]],和变量预期类型匹配,因此不会报错。
解决方法
你只要提前给read_cols加显式的类型标注,告诉MyPy这个变量允许接收None值即可,修改后的代码如下:
from typing import List, Optional def get_relevant_params() -> List[str]: return sorted(list(set(['1', '2', '3']))) def get_config(config_path: Optional[str] = None) -> Optional[List[str]]: # 提前显式标注变量类型 read_cols: Optional[List[str]] if config_path: read_cols = get_relevant_params() else: read_cols = None return read_cols
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

