【问题标题】:How to view the implementation of python's built-in functions in pycharm?如何在pycharm中查看python内置函数的实现?
【发布时间】:2018-08-30 00:45:12
【问题描述】:

当我尝试查看 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

【问题讨论】:

  • 看到它是一个内置函数,它很可能是用C编写的,你的名字“内置”......直接内置在解释器中。 (只是我的 2 美分)
  • 您是否正确选择了口译员?当我右键单击 all() 然后选择 Go To / Declaration 时,它对我有用

标签: python function pycharm built-in


【解决方案1】:

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


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


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

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


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

这都是非常简单的东西。难道你不能把所有的知识编程到一个脚本中,然后你可以用它来构建一个 PyCharm 插件吗?

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


1。此外,即使是 内置的东西也是用 Python 和称为 RPython 的 Python 子集编写的,您可能会发现它比 C 更容易理解 - 再说一次,找到源代码通常更难,而且所有看起来都像 Python 的多个层次很难保持一致。

【讨论】:

  • 感谢您的回答,我是一个编程新手,只了解您回答的一部分,您所说的将二进制文件连接到源代码是什么意思?我想我是在问从 python 函数导航到 C 中的源代码,没有二进制对吗?
  • @LukAron Windows 编译的 C 是一个 .exe 或 .bin 文件,它是一个二进制文件(机器语言代码)。我认为在这里将二进制文件连接到源代码意味着将您在 python 代码中看到的抽象函数声明与其在二进制文件中的实现联系起来。
猜你喜欢
  • 2018-09-03
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 2021-10-05
  • 2016-04-08
  • 2011-08-06
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多