MyPy - 赋值中的不兼容类型(表达式的类型为 None,变量的类型为 X)
MyPy - Incompatible types in assignment (expression has type None, variable has type X)
有人知道为什么 MyPy 会抱怨这个吗?这是非常令人沮丧的,因为如果它是三元的,它就可以工作,但如果是标准的 if/else:
就不行
from typing import List, Optional, Union
def get_relevant_params() -> List[str]:
return sorted(list(set(['1', '2', '3'])))
# also doesn't work with: ... -> Union[List[str], None]
def get_config(config_path: Optional[str] = None) -> Optional[List[str]]:
# this doesn't work
if config_path:
read_cols = get_relevant_params()
else:
read_cols = None
# # this works
# read_cols = get_relevant_params() if config_path else None
return read_cols
这是一个带有示例的交互式 MyPy 操场: https://mypy-play.net/?mypy=latest&python=3.8&gist=2c846e569ecbd5f8884367393a754adc
您没有注释 read_cols
,因此 mypy 必须根据对 read_cols
的第一个分配为其 infer a type。第一个赋值分配了一个 List[str]
类型的值,因此 mypy 决定这是 read_cols
的类型,而 None
不是该类型的有效值。
如果您想要不同的类型,请注释您的变量:
read_cols: Optional[List[str]]
将第 11 行更改为:
read_cols: Optional[List[str]] = get_relevant_params()
你的问题是 mypy 自动将变量 read_cols
的类型识别为 List[str],因为那是 get_relevant_params
的 return 类型。然后,当您尝试将 None 分配给它时,它会显示“不兼容的类型”。如果您在创建变量时指定希望它是可选的,则一切正常。
也许更简洁的解决方案是避免使用 return 变量。
if config_path:
return get_relevant_params()
else:
return None
这样,就不会混淆 config_path
的类型了。
有人知道为什么 MyPy 会抱怨这个吗?这是非常令人沮丧的,因为如果它是三元的,它就可以工作,但如果是标准的 if/else:
就不行from typing import List, Optional, Union
def get_relevant_params() -> List[str]:
return sorted(list(set(['1', '2', '3'])))
# also doesn't work with: ... -> Union[List[str], None]
def get_config(config_path: Optional[str] = None) -> Optional[List[str]]:
# this doesn't work
if config_path:
read_cols = get_relevant_params()
else:
read_cols = None
# # this works
# read_cols = get_relevant_params() if config_path else None
return read_cols
这是一个带有示例的交互式 MyPy 操场: https://mypy-play.net/?mypy=latest&python=3.8&gist=2c846e569ecbd5f8884367393a754adc
您没有注释 read_cols
,因此 mypy 必须根据对 read_cols
的第一个分配为其 infer a type。第一个赋值分配了一个 List[str]
类型的值,因此 mypy 决定这是 read_cols
的类型,而 None
不是该类型的有效值。
如果您想要不同的类型,请注释您的变量:
read_cols: Optional[List[str]]
将第 11 行更改为:
read_cols: Optional[List[str]] = get_relevant_params()
你的问题是 mypy 自动将变量 read_cols
的类型识别为 List[str],因为那是 get_relevant_params
的 return 类型。然后,当您尝试将 None 分配给它时,它会显示“不兼容的类型”。如果您在创建变量时指定希望它是可选的,则一切正常。
也许更简洁的解决方案是避免使用 return 变量。
if config_path:
return get_relevant_params()
else:
return None
这样,就不会混淆 config_path
的类型了。