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, похоже, вполне способен распознавать поведение, проявляемое, например. итераторы, так что это все еще несколько странно.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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