python 存根_pyi文件是干吗的?(一文读懂Python的存根文件和类型检查)

参考资料:html

写这篇文章的缘由是我在网上下载的项目中看到了.pyi文件,可是寻找了不少资料才对这些个概念(存根文件、类型检查)有了一个直观的印象。这篇随笔的目的是用最短的篇幅让你理解这些概念!测试

首先我介绍几个论断:this

1. PEP484spa

首先PEP是Python社区使用的规范化文档(就好像IETF用的rtf),PEP484这个文档是对type hint做规范化的文档!它规范化了type hint所需的语法用法...好比若是你关心stub存根文件是怎么作规范化的,你能够看参考资料2。.net

2.type checkercode

PEP484只是一个规范化的文档,没有给出具体的hint软件。事实上有一个内置模块叫typing,但它是让你用规范的语法写type hint的。不是一个类型检查器!!!htm

问:有哪些类型检查器可用?答:Pycharm内置有type checker,而且可用,明确支持stub file。mypy这个软件明确支持stub。其余的hinter,pyhinter等...我测试了一下,在vscode中效果不理想。

3.来看看,一个最简单的type hint,一个最简单的stub file长什么样

一个最简单的带annotation(type hint)的函数定义:

def greeting(name: str) -> str:

return "Hello" + name

一个最简单的stub file:

def greeting(name: str) -> str: ...

4.后缀为.pyi的stub存根文件的做用:

当没有存根文件,同时在函数定义的时候不加annotation的状况:

ae7c992dbb4ec6bb50bc4579eb8fe3fa.png

可见,因为python没有内置静态类型检查,只有运行时的动态检查。Pycharm给这个在运行时会出错的文件打了小对勾。

可是,当咱们在同一个文件夹下写一个stub file以后呢?

python 存根_pyi文件是干吗的?(一文读懂Python的存根文件和类型检查)_第1张图片

有了stub file的指引,有了Pycharm内置的type checker作静态检查驱动。在代码没有运行的时候就检查出来了类型错误!!这在维护大型的项目的时候是很是有用的。

看了上面这几个论断,你是否是对相关的概念有了一个初步的理解?下面咱们本身动手作一个实验,目的是在一个文件夹中写module并定义函数,在另外一个文件夹中统一存放存根文件(由于方便管理呀,而且可以屡次使用实现复用!)并且咱们已经知道了,type checker这个活不是必须的,能够由mypy,Pycharm来干,那么咱们想找到指导固然要寻求这些工具的指导。好比:Pycharm的stub说明。https://www.jetbrains.com/help/pycharm/stubs.html#create-stub-external,废话很少说,动手作一作。

第一步:

生成代码文件和存根文件,其中存根文件放到一个统一的文件夹中统一存放。

python 存根_pyi文件是干吗的?(一文读懂Python的存根文件和类型检查)_第2张图片

第二步:

按照Pycharm文档中的指引,将存根文件的目录添加到PATH中,必定要注意文件名要对应上。(在IDE中能够方便的配置,当真正工程上应用的话可能就要手动添加PATH了,但要注意:hints是给人看的,类型检查也是给人警告的,不能脱离应用)

Reuse stubs

You can make your stubs accessible for your other PyCharm projects.

Click the Project Interpreter selector in the Status Bar and select Interpreter Settings.

In the Project Interpreter dialog, click

 and select Show All, then in the opened Project Interpreters dialog, click 

.

In the Interpreter paths dialog, click

 to add the new path record:

python 存根_pyi文件是干吗的?(一文读懂Python的存根文件和类型检查)_第3张图片

Inspect your project: the directory with the stub files is now marked as a library root.

d8b74d23c7f296ab4cfb3144c964f3ff.png

Any time you will use this project interpreter to work with other projects, this stub library will be accessible through the path you have just added.

第三步:

看一下结果,发现两个module文件都找到了对应的存根。其中在最左边出现了 * ,点击的话能够在实现以及存根中跳转。

7cd51ba1beeeb2d6d0ee23fe9b640e68.png

你可能感兴趣的:(python,存根)