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?
到目前为止我尝试过的事情:
3.6)pip 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 上重新安装预提交,从而导致了问题。]
解决方案很简单:只需使用 --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 下运行 mypy。mypy默认为用于运行它的 Python 版本。
您有两个选择:
--python-version您可以使用命令行选项更改Python语言版本:
此标志将使 mypy 类型检查您的代码,就好像它在 Python 版本 XY 下运行一样 如果没有此选项,mypy 将默认使用运行 mypy 的任何 Python 版本。
我将其放入项目 mypy 配置文件中;相当于命令行开关的名称是python_version;把它放在全局[mypy]部分:
[mypy]
python_version = 3.7
Run Code Online (Sandbox Code Playgroud)
将 mypy 安装到项目的 virtualenv 中,以便它使用完全相同的 Python 版本。
请注意,如果您看到此问题(并且不是意外--python-version在命令行或配置文件中设置, ,则您肯定没有从项目 venv.conf 运行 mypy )。