目录
介绍
众所周知,Python是一门动态类型语言,在运行期间才去做数据类型检查的语言,有以下优点
1. 开发迅速。 利用传统的静态语言要开发几周的功能和特性,使用动态语言也许几天甚至几个小时就可以实现。
2. 代码量少。静态函数式语言的表达能力也很强
3. 测试便捷。 很容易实现反射等动态特性
4. 内置丰富的原生数据结构。 提供了大量操作(如数组分片,字典更新等)
5. 简单易学。 动态语言的语法相对简单,helloworld只需要一行(c++代码全写一行的不算)
当然也是有缺点的
1. 最头疼的就是运行效率。因为都是在运行时去分析数据类型,但是也有一些解决方案通过Cache和优化,可以通过C/C++实现扩展提高运行效率
2. 代码错误难于发现。 动态语言由于没有构建的过程,因此很多错误只有等到运行时才会发现。这也是我比较喜欢静态语言的原因,很多问题在开发编译阶段就能发现并解决
因此MyPy应运而生,作为 Python 的一个可选静态类型检查器,旨在结合动态类型和静态类型的优点。mypy 将 Python 的表达能力和便利性与强大的类型系统和编译时类型检查相结合。mypy 类型检查标准 Python 程序;使用任何 Python VM 运行它们,基本上没有运行时开销。
安装
mypy需要python3.6+,然后使用pip直接安装即可。
pip install mypy
接下来就可以直接在使用mypy了,例如:
mypy vec.py
使用
就可以实现对代码进行静态类型检查,但是前提是你的代码使用了类型注解,否则mypy什么也检查不出来。mypy检查的结果是基于类型注解以及.pyi的,需要注意的是需要在相关package下新增py.typed用于mypy查找注解文件,这意味你可以忽略mypy所提示的错误,只把它当做警告。
默认情况下,mypy不会对动态类型函数进行类型检查,vscode中需要安装pylance。例如下面的代码:
pycharm
vscode
Pybind11与Mypy结合
通过pybind11-stubgen可以方便的自动生成所需的pyi文件,使用也非常简单
pybind11-stubgen --ignore-invalid=all mypackage.core
如果不能正确Pycharm加载module,可以采用以下方法
删除远程library
同时也在服务上删除 .pycharm_helpers文件夹
再在Pycharm Interpreters中更新一下相关包就可以了