MyPy не распознает x[idx] как логическое значение после isinstance(x[idx], bool) ⇐ Python
MyPy не распознает x[idx] как логическое значение после isinstance(x[idx], bool)
Основная проблема
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, похоже, вполне способен распознавать поведение, проявляемое, например. итераторы, так что это все еще несколько странно.
Основная проблема
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, похоже, вполне способен распознавать поведение, проявляемое, например. итераторы, так что это все еще несколько странно.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему логическое значение для int выполняется быстрее по сравнению с bool
Anonymous » » в форуме C++ - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-