使用mypy对python程序进行静态检查
前言
在此之前,我认为 Python 的类型提示就是一个花瓶,看起来好看,但并没有实质的作用,因为即使类型写错了,或者传错了,程序仍然可以运行,直到我发现了 mypy 这个工具。今天就来聊一聊 mypy。
mypy 是 Python 中的静态类型检查器。写完带有类型提示的代码之后,先别运行行,用 mypy 命令来检查下你的代码,如果有错误,会提示你,这让 Python 的类型提示有了真正的作用。后续开发的过程中可以强制 mypy 检查无误后才能上线,借此提高代码的可读性和可维护性。
嗯,很实用,不是吗?下面分享一下如何使用 mypy。
1、安装
这个很简单了,pip install mypy 就搞定了。
2、执行
假如有这样一个 Python 程序,名称叫 demo1.py,内容如下:
def greeting(name: str) -> str: #这里提示有问题
print (f'Hello { name }')
x: str = 'xxx'
y: int = "yyy" #这里应该提示有问题
greeting(x)
greeting(y) #这里应该提示有问题
代码我已经指出了两处错误,现在让 mypy 检查一下:
果然,mypy 发现了三处错误,并一一提示,非常好用啊。
如果不希望检查某一行,可以在注释上加上"# type: ignore":
y: int = "yyy" # type: ignore
mypy 具有强大且易于使用的类型系统,具有很多优秀的特性,例如类型推断、泛型、可调用类型、元组类型、联合类型和结构子类型。
3、常用的内置类型
4、配置文件
mypy 将依次查找当前目录下配置文件
mypy.ini
.mypy.ini
pyproject.toml
setup.cfg
如果还找不到,则依次寻找下面的配置文件:
$XDG_CONFIG_HOME/mypy/config
~/.config/mypy/config
~/.mypy.ini
此外,你也可以使用??--config-file?
? 指定配置文件。
一个典型的 mypy.ini 配置文件如下:
# Global options: [mypy] python_version = 3.7 warn_return_any = True warn_unused_configs = True # Per-module options: [mypy-mycode.foo.*] disallow_untyped_defs = True [mypy-mycode.bar] warn_return_any = False [mypy-somelibrary] ignore_missing_imports = True
配置文件的详细说明,见官方文档:https://mypy.readthedocs.io/en/stable/
常见配置项:
files 逗号分隔的路径列表,如果命令行上没有给出,则应由 mypy 检查,支持递归。
exclude 应忽略检查的文件名、目录名和路径
ignore_missing_imports 禁止有关无法解析的导入的错误消息。
disallow_untyped_defs 不允许定义没有类型注释或类型注释不完整的函数。
plugins 逗号分隔的 mypy 插件列表
最后的话
mypy 是自动化测试中很重要的一部分,可以帮助我们检查 Python 语言的类型提示是否正确,减少代码的 bug,Python 开发的朋友们一定要用一用。