如何让 mypy 识别较新版本的 python?

Cha*_*e A 12 python python-3.x mypy python-3.7

我刚刚将项目更新到 Python 3.7,当我在项目上运行 mypy 时,我看到此错误:error: "Type[datetime]" has no attribute "fromisoformat"

datetime 在 Python 3.7 中确实有这个函数fromisoformat,但在以前的 Python 版本中没有。为什么 mypy 报告此错误,如何让它正确分析 Python 3.7?

到目前为止我尝试过的事情:

  • 删除 .mypy_cache (其中有一个看起来可疑的子文件夹,标题为3.6
  • 重新安装 mypypip install --upgrade --force-reinstall mypy

重现:

  • 创建一个python 3.6项目

  • 在项目 venv 中安装 mypy 0.761(最新)

  • mypy .使用 mypy ( )扫描项目

  • 将项目更新为python 3.7

  • 添加一个包含以下代码的文件:

    from datetime import datetime
    datetime.fromisoformat('2011-11-04 00:05:23.283')
    
    Run Code Online (Sandbox Code Playgroud)
  • 再次扫描项目 ( mypy .) [更新:这实际上工作得很好。它重新运行我的预提交挂钩,而没有在新的 Python 版本 venv 上重新安装预提交,从而导致了问题。]

Cha*_*e A 9

解决方案很简单:只需使用 --python-version 标志运行 mypy 即可。所以就我而言是的--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]

Run Code Online (Sandbox Code Playgroud)

如果您经常从命令行运行 mypy,您还可以将其添加到配置文件中,如下所述https://mypy.readthedocs.io/en/stable/config_file.html

另请注意:如果 mypy 在预提交挂钩运行时报告错误,但在从项目 venv 自行运行时则不报告错误,那么您需要

  • 像我上面那样添加 python-version 作为参数,或者
  • 在新项目 venv 中重新安装预提交(使用正确的 python 版本)


Mar*_*ers 6

您正在旧版本的 Python 下运行 mypy。mypy默认为用于运行它的 Python 版本。

您有两个选择:

请注意,如果您看到此问题(并且不是意外--python-version在命令行或配置文件中设置, ,则您肯定没有从项目 venv.conf 运行 mypy )。