MyPy 在 isinstance(x[idx], bool) 之后无法将 x[idx] 识别为布尔值

问题描述 投票:0回答:1

核心问题
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 我研究了很多关于类似问题的帖子,但从未找到“足够”明确的答案。 → 我是不是错过了什么?

python type-inference mypy isinstance
1个回答
-1
投票

您可以使用 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
© www.soinside.com 2019 - 2024. All rights reserved.