MyPy не распознает x[idx] как логическое значение после isinstance(x[idx], bool)Python

Программы на Python
Anonymous
MyPy не распознает x[idx] как логическое значение после isinstance(x[idx], bool)

Сообщение Anonymous »


Основная проблема
MyPy не может идентифицировать/проверить возвращаемое значение x[idx] как имеющее логическое значение.

если isinstance(x[idx], bool) имеет значение True: вернуть х[idx] Полный пример кода

набрав import Union, необязательно x: dict[str, Union[bool, str]] = {'a': True, 'b': 'foo'} def return_if_bool(idx: str) -> Необязательно[bool]: если isinstance(x[idx], bool): вернуть х[idx] возврат Нет печать(return_if_bool('a')) MyPy возвращается
8: ошибка: несовместимый тип возвращаемого значения (получено «bool | str», ожидается «bool | None») [возвращаемое значение]

Обходной путь
Что работает, так это использование typing.cast:

return typing.cast(bool, x[idx]) @Wombatz указал на «более чистый»(imo) обходной путь, позволяющий избежать приведения: назначьте y = x[idx], как в:

y: Union[bool, str] = x[idx] если isinstance(y, bool): вернуть y Почему?
Я ожидал, что это сработает без необходимости прибегать к typing.cast() или присваивать переменной y = x[idx], но не мог полностью понять, почему это не так, тем более что это выглядит невероятно тривиально.

Возможные объяснения
Информация @Wombatz о том, что MyPy не может знать, что x[idx] вернет одно и то же значение при повторном доступе, имеет смысл и очень близка к полному ответу на этот вопрос. Тем не менее, MyPy, похоже, вполне способен распознавать поведение, проявляемое, например. итераторы, так что это все еще несколько странно.

Вернуться в «Python»