【问题标题】:What is the use of stub files (.pyi ) in python?python中存根文件(.pyi)的用途是什么?
【发布时间】:2020-03-21 21:55:26
【问题描述】:

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

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

【问题讨论】:

  • 也许你在找这个? Modules/_posixsubprocess.c
  • 所以它本质上是一个Cython模块,可以直接集成到python解释器中作为C编译代码,如果我错了,请纠正我?
  • “直接集成”可能不是我会选择的措辞。编译后它将成为一个.so/.pyd 文件,如果在路径上可以找到该文件,则可以导入该文件。您可以“轻松”在 C 中创建自己的模块。不过我怀疑它是 cython。它更有可能使用the standard way of writing C extensions
  • 顺便说一句:你提到_posixsubprocess,在CPython中是一个.c文件,但你也提到你把它看作一个.pyi文件。你到底在哪里找到.pyi 文件?你有 Python 源代码库的链接吗?
  • .. 没关系...我在“排版”中找到了它。我会更新我的答案

标签: python python-3.x subprocess system


【解决方案1】:

_posixsubprocess

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

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

该文件可以在the typeshed 中找到,它是存根文件的集合。 typeshed 还包含第三方模块的存根,这是一个历史遗留问题。由于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: ... 注释语法
  • 您将函数注释用于其他用途,但仍想使用类型提示
  • 您正在将类型提示添加到现有代码库中,并希望将现有文件中的代码搅动降至最低

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-19
    • 2019-12-24
    • 2020-02-09
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多