Mypy catch AttributeError - PullRequest
       12

Mypy catch AttributeError

1 голос
/ 19 июня 2019

использовали следующий код

import yaml
try:
    filterwarnings(yaml.YAMLLoadWarning)
except AttributeError:
    pass

Но когда я попытался запустить mypy сегодня, я получил "модуль не имеет атрибута YAMLLoadWarning". Что верно в некоторых версиях Python. Есть ли лучший способ написать это?

EDIT:

Чтобы быть немного понятнее, я знаю, как игнорировать ошибку (и ловить исключение, связанное с Python 3.6 версии pyyaml, не включая это исключение). Мой вопрос больше о работе с парсером. Рассмотрим эти примеры -

Я знаю, что если у вас есть функция, которая возвращает более конкретный тип

def bad(a: Optional[int]) -> int:
    return a  # Incompatible return value type (got "Optional[int]", expected "int")

Вы можете использовать ветку для принудительного возврата только правильного типа, и анализатор замечает

def good(a: Optional[int]) -> int:
    if a:
        return a
    return 0

Итак, в ситуациях, когда вы обрабатываете ошибки с помощью оператора try / catch, есть ли способ построить это так, чтобы синтаксический анализатор понял, что ошибка атрибута обрабатывается?

def exception_branch(a: Optional[str])-> list:
    try:
        return a.split()  # Item "None" of "Optional[str]" has no attribute "split"
    except:
        return []

1 Ответ

0 голосов
/ 19 июня 2019

Я предполагаю, что вы используете PyYAML?

В этом случае наилучшим долгосрочным решением, вероятно, является отправка запроса на извлечение в Typeshed, включая подсказки типов для этого класса.(Typeshed является хранилищем подсказок типов для стандартных библиотечных модулей и модулей сторонних производителей. Заглушки для PyYAML случайно включены в типизированные здесь .)

Кажется, PyYAML определяет YAMLLoadWarningв файле __init__.py модуля, поэтому вам, вероятно, следует добавить подсказки типов для этого класса в соответствующем файле __init__.pyi в Typeshed .

Затем вы ждетеследующий выпуск mypy - он запекается в последней доступной версии Typeshed на момент выпуска.

Я полагаю, что mypy на самом деле запланировано выпустить позже сегодня , поэтому время может быть немногоплотно, если вы в конечном итоге представить PR.Но в худшем случае вам нужно будет подождать еще месяц или два для последующего выпуска mypy.

А пока вы можете просто добавить к этой строке комментарий # type: ignore, например предложенный Георгием в комментариях .

Если вы сделаете это, я также рекомендую запустить mypy с флагом командной строки --warn-unused-ignores.Это поможет вам найти # type: ignore комментариев, которые вам больше не нужны, поскольку mypy выпускается / улучшается со временем.

...