如何在PyCharm中查看Python内置函数的实现?

7

当我试图在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

2
鉴于它是一个内置函数,很可能是用C编写的,因此被称为“内置”……直接内置在解释器中。(仅代表个人观点) - Lohmar ASHAR
你是否已经正确选择了解释器?当我右键单击 all() 然后选择 转到 / 声明 时,它对我有效。 - jeschwar
1个回答

3
假设您正在使用通常的CPython解释器,all是一个内置函数对象,它只是指向编译为解释器(或libpython)静态链接的函数的指针。对于绝大多数人来说,在该地址处显示x86_64机器代码可能没有太大用处。
尝试在PyPy中运行您的代码,而不是在CPython中运行。在PyPy中,许多在CPython中内置的内容都是普通的Python代码。1当然,并非总是这样的选择(例如,PyPy尚不支持3.7功能,有一些第三方扩展模块仍然过于缓慢以至于无法使用,如果您在某些不常见的平台上,则更难构建...),所以让我们回到CPython。
该函数的实际C源代码并不难在网上找到。它在bltinmodule.c中。但是,与标准库中的Python模块的源代码不同,您可能没有这些文件。即使您确实拥有它们,将二进制文件与源代码连接的唯一方法是通过在从该源代码编译CPython时发出的调试输出,而您可能没有这样做。但是,如果您认为这听起来很棒-那就是。构建自己的CPython(您可能需要一个Py_DEBUG版本),然后您只需在C源代码调试器/IDE中运行它,它可以处理所有笨拙的部分。
但是,如果这听起来比有帮助更可怕,即使您可以阅读基本的C代码并想找到它...
我如何知道在GitHub上找到该代码?好吧,我知道repo在哪里;我知道将源代码组织为Python、Objects、Modules等的基本组织方式;我知道模块名称通常映射到C源文件名称;我知道内置函数在几个方面都是特殊的...
这些都是相当简单的东西。你不能只将所有这些知识编程到一个脚本中,然后用它构建出一个PyCharm插件吗?
您可以在一个快速的夜间黑客攻击中完成前50%左右,这样的事情遍布GitHub的海岸线。但是,要正确地执行此操作,需要处理大量特殊情况、解析一些丑陋的C代码等。对于任何能够编写这样的东西的人来说,使用lldb Python比编写它更容易。
1. 此外,即使是内置内容也是由Python和称为RPython的Python子集混合编写的,您可能会发现它比C更容易理解-然而,找到该源代码通常更加困难,并且所有看起来像Python的多个级别可能很难保持一致。

谢谢您的回答,我是一个编程新手,只理解了您回答的一部分,您所说的“将二进制连接到源代码”是什么意思?我猜我是在询问从Python函数导航到C语言源代码,这里没有二进制文件,对吗? - Luk Aron
@LukAron Windows编译的C语言文件是一个二进制文件(机器语言代码),扩展名为.exe或.bin。我认为将二进制文件与源代码连接起来意味着将你在Python代码中看到的抽象函数声明与其在二进制文件中的实现相关联。 - Or b
@abarnert 这个回答太棒了!谢谢。它解决了我多年来一直困扰的难题。祝你有个美好的一天! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接