python 中的存根文件 (.pyi) 有什么用?

What is the use of stub files (.pyi ) in python?

我正在尝试了解 python 3 的较低级别实现。subprocess 模块使用了一个名为 _posixsubprocess 的模块。我试图在我的系统中找到这个模块的位置,发现它是一个存根文件。

有人可以指导我吗,因为我不知道什么是存根文件以及它们是如何在较低级别实现的?

_posixsubprocess

您引用的文件是用 C 编写的 Python 模块。它不是 "stub" 文件。真正的实现可以在 Modules/_posixsubprocess.c. You can see how writing a C/C++ extension is written by having a look at Building C and C++ Extensions 的标准库中找到。这应该可以帮助您理解 _posixsubprocess.c.

中的代码

为了向该文件添加类型提示(这是一个 "Extension Module",因为它是用 C 语言编写的),类型提示被添加到扩展名为 "stub" 的文件中15=].

可以在the typeshed which is a collection of stub files. The typeshed also contains stubs for third-party modules which is a historical remnant. That is no longer needed since PEP-561中找到的文件已被采纳。

关于 stub/pyi 个文件

存根文件包含普通 Python 模块的类型提示信息。可以找到完整的官方文档 in the section about stub-files in PEP-484.

例如,如果您有这样的 Python 模块 mymodule.py

def myfunction(name):
   return "Hello " + name

然后您可以通过存根文件添加类型提示 mymodule.pyi。请注意,这里的省略号 (...) 是语法的一部分,因此下面的代码块真正显示了完整的文件内容:

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

它们看起来与 C 头文件非常相似,因为它们只包含函数签名,但它们的使用完全是可选的。

您还可以直接在 .py 模块中添加类型提示,如下所示:

def myfunction(name: str) -> str:
   return "Hello " + name

但在某些情况下,您希望将它们在存根中分开:

  • 您想保持代码 Python 2 兼容并且不喜欢 # type: ... 注释语法
  • 您将函数注释用于其他用途,但仍想使用类型提示
  • 您正在将类型提示添加到现有代码库中,并希望将现有文件中的代码改动保持在最低限度