【mypy+pybind11】静态检查与代码提示补全神器

目录

介绍

安装

使用

Pybind11与Mypy结合


介绍

众所周知,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

GitHub - sizmailov/pybind11-stubgen: Generates stubs for python modules (targeted to C++ extensions compiled with pybind11)​​​​​​​​​​​​​​​​​​​​​Generates stubs for python modules (targeted to C++ extensions compiled with pybind11) - GitHub - sizmailov/pybind11-stubgen: Generates stubs for python modules (targeted to C++ extensions compiled with pybind11)https://github.com/sizmailov/pybind11-stubgen

如果不能正确Pycharm加载module,可以采用以下方法

删除远程library

同时也在服务上删除 .pycharm_helpers文件夹

再在Pycharm Interpreters中更新一下相关包就可以了

猜你喜欢

转载自blog.csdn.net/weixin_43953700/article/details/124495684