Как вы получаете mypy для распознавания более новой версии python? - PullRequest
3 голосов
/ 29 февраля 2020

Я только что обновил свой проект до Python 3.7, и я вижу эту ошибку при запуске mypy в проекте: error: "Type[datetime]" has no attribute "fromisoformat"

datetime имеет функцию fromisoformat в Python 3.7, но не в предыдущих версиях Python. Почему mypy сообщает об этой ошибке и как мне заставить ее правильно проанализировать Python 3.7?

То, что я до сих пор пробовал:

  • Удаление .mypy_cache (с подозрительно выглядящей подпапкой с названием 3.6)
  • Переустановка mypy с помощью pip install --upgrade --force-reinstall mypy

Воспроизвести:

  • Создание проекта python 3.6

  • установка mypy 0.761 (самая последняя) в проекте venv

  • Сканирование проект с mypy (mypy .)

  • обновить проект до python 3.7

  • добавить файл с этим кодом:

    from datetime import datetime
    datetime.fromisoformat('2011-11-04 00:05:23.283')
    
  • снова сканировать проект (mypy .) [ОБНОВЛЕНИЕ: это на самом деле работает нормально. Это приводило к перезапуску моих ловушек precommit без переустановки pre-commit в новой версии Python venv, что вызывало проблемы.]

Ответы [ 2 ]

3 голосов
/ 29 февраля 2020

Решение было простым: просто запустите mypy с флагом - python -version. так что в моем случае это было --python-version=3.7.

Если вы используете pre-commit , вы также можете добавить это в качестве аргумента при предварительной проверке в вашем .pre-commit-config.yaml. Мой выглядит следующим образом:

repos:

...

- repo: https://github.com/pre-commit/mirrors-mypy
  rev: v0.750  # Use the sha / tag you want to point at
  hooks:
      - id: mypy
        args: [--python-version=3.7]

Если вы часто запускаете mypy из командной строки, вы также можете добавить его в файл конфигурации, как описано здесь https://mypy.readthedocs.io/en/stable/config_file.html.

Еще одно замечание: если mypy сообщает об ошибках при запуске хуков перед фиксацией, но не когда он запускается сам по себе из проекта venv, вам нужно либо

  • добавить python -version в качестве аргумента, как я делаю выше, или
  • переустановить предварительную фиксацию в новом проекте venv (с правильной python версией)
1 голос
/ 29 февраля 2020

Mypy работает под старой версией Python. mypy по умолчанию используется версия Python, которая используется для его запуска.

У вас есть два варианта:

  • Вы можете изменить языковую версию Python с параметром командной строки --python-version :

    Этот флаг заставит тип mypy проверять ваш код, как если бы он был запущен в Python версии XY. Без этой опции mypy по умолчанию будет использоваться любая версия Python, на которой работает mypy.

    Я бы поместил это в файл конфигурации mypy проекта ; Эквивалент переключателя командной строки называется python_version; поместите его в глобальный [mypy] раздел:

    [mypy]
    python_version = 3.7
    
  • Установите mypy в virtualenv вашего проекта, чтобы он использовал точно такую ​​же версию Python.

Обратите внимание, что если вы видите эту проблему (и случайно не установили --python-version в командной строке или в файле конфигурации , вы, безусловно, не запуск mypy из вашего проекта venv.

...