核心问题
MyPy 无法识别/验证返回值
x[idx]
为布尔类型。
if isinstance(x[idx], bool) is True:
return x[idx]
完整示例代码
from typing import Union, Optional
x: dict[str, Union[bool, str]] = {'a': True, 'b': 'foo'}
def return_if_bool(idx: str) -> Optional[bool]:
if isinstance(x[idx], bool) is True:
return x[idx]
return None
print(return_if_bool('a'))
MyPy 返回
8: error: Incompatible return value type (got "bool | str", expected "bool | None") [return-value]
解决方法
有效的是使用typing.cast:
return typing.cast(bool, x[idx])
为什么?
我希望这不需要求助于
typing.cast()
就能工作,但不明白为什么它不起作用,特别是因为它看起来非常微不足道。
PS 我研究了很多关于类似问题的帖子,但从未找到“足够”明确的答案。 → 我是不是错过了什么?
您可以使用 Union 注释显式指定函数的返回类型:
from typing import Union, Optional
x: dict[str, Union[bool, str]] = {'a': True, 'b': 'foo'}
def return_if_bool(idx: str) -> Optional[bool]:
if isinstance(x[idx], bool):
return x[idx]
return None
print(return_if_bool('a'))
输出:
True