python中的stub文件(.pyi)的用途

2022/7/28 1:52:49

本文主要是介绍python中的stub文件(.pyi)的用途,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在阅读TVM源码时,发现了*.pyi文件,里面的函数没有具体的实现,都诸如如下的形式,感到很疑惑。

@overload
def getattr(__o: object, __name: str, __default: _T) -> Any | _T: ...
def globals() -> dict[str, Any]: ...
def hasattr(__obj: object, __name: str) -> bool: ...
def hash(__obj: object) -> int: ...
def help(request: object = ...) -> None: ...
def hex(__number: int | SupportsIndex) -> str: ...
def id(__obj: object) -> int: ...
def input(__prompt: object = ...) -> str: ...

查阅资料,简单的印象就是这是对类型进行检查的,但我并没有找到该函数的具体实现,难道只需要写个这就能对类型进行检查,这点还是带点疑惑的


转载:
https://www.likecs.com/show-308410242.html

  参考资料:

  https://blog.csdn.net/weixin_40908748/article/details/106252884

  https://www.python.org/dev/peps/pep-0484/

  https://www.jetbrains.com/help/pycharm/stubs.html

写这篇文章的原因是我在网上下载的项目中看到了.pyi文件,但是寻找了很多资料才对这些个概念(存根文件、类型检查)有了一个直观的印象。这篇随笔的目的是用最短的篇幅让你理解这些概念!
首先我介绍几个论断:

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

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

问:有哪些类型检查器可用?答: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的情况:
image
可见,由于python没有内置静态类型检查,只有运行时的动态检查。Pycharm给这个在运行时会出错的文件打了小对勾。

但是,当我们在同一个文件夹下写一个stub file之后呢?
image
有了stub file的指引,有了Pycharm内置的type checker做静态检查驱动。在代码没有运行的时候就检查出来了类型错误!!这在维护大型的项目的时候是非常有用的。


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

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

第二步:
按照Pycharm文档中的指引,将存根文件的目录添加到PATH中,一定要注意文件名要对应上。(在IDE中可以方便的配置,当真正工程上应用的话可能就要手动添加PATH了,但要注意:hints是给人看的,类型检查也是给人警告的,不能脱离应用)
Reuse stubs
You can make your stubs accessible for your other PyCharm projects.

  1. Click the Interpreter Settings.
    image

  2. In the .

  3. In the to add the new path record:
    image

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

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文件都找到了对应的存根。其中在最左边出现了 * ,点击的话可以在实现以及存根中跳转。
image



这篇关于python中的stub文件(.pyi)的用途的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程