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

Rah*_*sai 18 python subprocess system python-3.x

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

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

exh*_*uma 27

_posixsubprocess

您引用的文件是用 C 编写的 Python 模块。它不是“存根”文件。真正的实现可以在 stdlib 中找到Modules/_posixsubprocess.c。您可以通过查看构建 C 和 C++ 扩展来了解如何编写 C/ C++ 扩展。这应该有助于您理解_posixsubprocess.c.

为了向该文件(它是用 C 编写的“扩展模块”)添加类型提示,将类型提示添加到扩展名为.pyi.

该文件可以在存根文件集合的 typeshed中找到。typeshed 还包含第三方模块的存根,这是历史遗留物。自从PEP-561被采用后,就不再需要了。

关于存根/pyi 文件

存根文件包含普通 Python 模块的类型提示信息。完整的官方文档可以在 PEP-484 中关于存根文件的部分中找到。

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

def myfunction(name):
   return "Hello " + name
Run Code Online (Sandbox Code Playgroud)

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

def myfunction(name: str) -> str: ...
Run Code Online (Sandbox Code Playgroud)

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

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

def myfunction(name: str) -> str:
   return "Hello " + name
Run Code Online (Sandbox Code Playgroud)

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

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