Используйте Mypy с Ruamel.yaml

Я пытаюсь использовать MyPy с модулями, которые используют ruamel.yaml, и Mypy не может найти ruamel.yaml, даже несмотря на то, что у Python нет проблем с его поиском. Я озадачен, потому что не могу найти модуль с именем YAML.py или класс с именем YAML, даже если эти операторы работают в Python:

from ruamel.yaml import YAML
yaml = YAML()
x = yaml.load()

Что мне нужно сделать, чтобы MyPy распознал ruamel.yaml?

3 ответа

Обходной путь - запустить без инкрементной логики mypy:

      python -m mypy --no-incremental myfile.py

Фон

В mypy есть известная проблема, см . здесь.

В итоге:

Что-то не работает с инкрементальной логикой mypy, когда она сталкивается ruamel.

  • Когда вы запускаете его один раз, все идет нормально. Это команда: python -m mypy myfile.py

  • Затем, когда вы запускаете его снова, вы получаете ошибку:

    error: Skipping analyzing 'ruamel': found module but no type hints or library stubs [import]

  • Потом при повторном запуске все нормально

  • и т.п.

Вы не должны искать файл YAML.py, YAML в

yaml = YAML()

это класс, который определен в ruamel/yaml/main.py и это импортируется в ruamel/yaml/__init__.py (оба под сайтом-пакеты). Вот почему вы делаете:

from ruamel.yaml import YAML

(альтернативой будет то, что есть файл yaml.py под каталогом ruamel, но загрузчик / дампер слишком много для одного файла).

Что может сработать, если приведенные выше знания не помогут вам разобраться, если явно установить глобальный флаг mypy_path или переменную среды MYPYPATH, Это должно включать каталог, в котором каталог ruamel расположен.

(Я не смог найти упомянутое в документации, но из источника (mypy/build.py:mypy_path()) вы можете видеть, что это должна быть строка, которая разбивается на os.pathsep (который является двоеточием (:) в моей системе на базе Linux))

У меня такая же проблема.

Даже после установки MYPYPATH=./. Venv/lib/python3.7/site-packages

Временное "решение" игнорирует отсутствующее исключение импорта

mypy --ignore-missing-import

Другие вопросы по тегам