【问题标题】:How do you get mypy to recognize a newer version of python?如何让 mypy 识别更新版本的 python?
【发布时间】:2020-02-28 21:44:08
【问题描述】:

我刚刚将我的项目更新到 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 的可疑子文件夹)
  • 使用 pip install --upgrade --force-reinstall mypy 重新安装 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')
    
  • 再次扫描项目 (mypy .) [更新:这实际上工作正常。它正在重新运行我的预提交挂钩,而没有在导致问题的新 Python 版本 venv 上重新安装预提交。]

【问题讨论】:

  • 事实上,您无法按照给出的说明重现您的问题。如果您按照您的说明将 mypy 安装到项目 venv 并将项目 venv 升级到 3.7 重新安装该 venv 中的所有项目,您就不会遇到此错误。
  • 换句话说,您遇到此问题是因为您在项目 venv 的外部安装了 mypy,该安装在 Python 3.6 或更早版本上运行。

标签: python python-3.x python-3.7 mypy


【解决方案1】:

解决方案很简单:只需运行带有 --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]

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

另一个注意事项:如果 mypy 在您的预提交挂钩运行时报告错误,而不是在它从项目 venv 自行运行时报告错误,那么您需要

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

【讨论】:

  • 与其每次都在命令行上设置,不如把它放到你项目的mypy configuration,在python_version = 3.7[mypy](全局)部分。
【解决方案2】:

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

你有两个选择:

  • 您可以使用--python-version command-line option 更改 Python 语言版本:

    此标志将使 mypy 类型检查您的代码,就好像它在 Python 版本 X.Y 下运行一样。如果没有这个选项,mypy 将默认使用运行 mypy 的任何版本的 Python。

    我会把它放在project mypy configuration file;命令行开关的等效名称为python_version;放到全局[mypy]部分:

    [mypy]
    python_version = 3.7
    
  • 将 mypy 安装到项目的 virtualenv 中,以便它使用完全相同的 Python 版本。

请注意,如果您看到此问题(并且没有在命令行或 configuration file 中意外设置 --python-version,则您肯定没有从您的项目 venv 运行 mypy .

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 2019-01-23
    • 2020-08-02
    • 2021-07-30
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多