如何查看python的内置函数在pycharm中的实现?

How to view the implementation of python's built-in functions in pycharm?

当我尝试查看 PyCharm 中的内置函数 all() 时,我只能在函数体中看到 "pass"。如何查看实际实现,才能知道内置函数到底做了什么?

def all(*args, **kwargs): # real signature unknown
    """
    Return True if bool(x) is True for all values x in the iterable.

    If the iterable is empty, return True.
    """
    pass

假设你使用的是普通的 CPython 解释器,all 是一个内置函数对象,它只有一个指向静态链接到解释器(或 libpython)的编译函数的指针。向您显示该地址的 x86_64 机器代码对绝大多数人来说可能不是很有用。


尝试 运行在 PyPy 中而不是 CPython 中编写您的代码。 CPython 中内置的许多东西在 PyPy 中都是普通的旧 Python 代码。1 当然,这并不总是一个选项(例如,PyPy 不目前还不支持 3.7 功能,有一些第三方扩展模块使用起来仍然太慢,如果你在一些不常见的平台上,很难自己构建......),所以让我们回到 CPython.


该函数的实际 C 源代码在网上并不难找到。它在 bltinmodule.c 中。但是,与标准库中 Python 模块的源代码不同,您可能没有这些文件。即使您 确实 拥有它们,将二进制文件连接到源代码的唯一方法是通过调试从该源代码编译 CPython 时发出的输出,而您可能没有这样做。不做。但如果你认为这听起来是个好主意——确实如此。自己构建 CPython(您可能想要一个 Py_DEBUG 构建),然后您可以 运行 在您的 C 源代码中 debugger/IDE 它可以处理所有笨拙的位。

但是如果这听起来更可怕而不是有用,即使您可以阅读基本的 C 代码并且想找到它......


我怎么知道在 GitHub 上哪里可以找到该代码?好吧,我知道回购协议在哪里;我知道源代码的基本组织方式为 Python、对象、模块等;我知道模块名通常如何映射到 C 源文件名;我知道内置函数在某些方面很特别……

这都是很简单的事情。难道你不能将所有这些知识编写成一个脚本,然后你可以从中构建一个 PyCharm 插件吗?

您可以在晚上快速完成前 50% 左右的工作,这样的事情在 GitHub 的海岸上随处可见。但实际上正确地做它需要处理大量的特殊情况,解析一些丑陋的 C 代码等。对于任何有能力编写这样的东西的人来说,只是 lldb Python 比编写它更容易。


1.此外,即使是 内建函数的东西也是混合编写的 Python 和一个名为 RPython 的 Python 子集,您可能会发现这更容易比 C 更容易理解——话又说回来,找到那个来源通常更难,而且看起来像 Python 的多个级别很难保持直线。