查找内置 Python 函数的源代码?

Posted

技术标签:

【中文标题】查找内置 Python 函数的源代码?【英文标题】:Finding the source code for built-in Python functions? 【发布时间】:2012-01-26 08:56:42 【问题描述】:

有没有办法查看内置函数在 python 中是如何工作的?我不仅仅指如何使用它们,还包括它们是如何构建的,sortedenumerate 背后的代码是什么 等等...?

【问题讨论】:

【参考方案1】:

由于 Python 是开源的,您可以阅读source code。

要找出特定模块或功能在哪个文件中实现,您通常可以打印__file__ 属性。或者,您可以使用inspect 模块,请参阅inspect 文档中的Retrieving Source Code 部分。

对于内置类和方法,这不是那么简单,因为inspect.getfileinspect.getsource 将返回一个类型错误,说明该对象是内置的。但是,许多内置类型可以在Objects sub-directory of the Python source trunk 中找到。例如,枚举类的实现参见here,list 类型的实现参见here。

【讨论】:

你能举一个enumerate的例子吗? 按照OP,“排序”的源代码怎么样?当然,inspect.getsourcefile(sorted) 不起作用。 @Quetzalcoatl sorted() 的源代码在 /Python/bltinmodule.c 虽然它只是调用 list.sort() 所以真正的源是在 /Objects/listobject.c 如果您提供了一个如何使用__file__的示例,将会很有帮助 作为对自己和未来谷歌人的说明:open() 函数在 Python 3 的 Modules/_io/_iomodule.c 中定义(而不是在其他内置函数中)。【参考方案2】:

这是补充@Chris' answer 的食谱答案,CPython 已移至 GitHub,Mercurial 存储库将不再更新:

    必要时安装 Git。

    git clone https://github.com/python/cpython.git

    代码将检出到名为cpython的子目录 -> cd cpython

    假设我们正在寻找print()的定义... egrep --color=always -R 'print' | less -R 啊哈!见Python/bltinmodule.c -> builtin_print()

享受吧。

【讨论】:

bltinmodule。啊啊啊啊。为什么他们必须把它拼写得如此糟糕?我尝试对builtin 进行快速文件系统搜索,但一无所获!【参考方案3】:

我不得不挖掘一下以找到以下Built-in Functions 的来源,因为搜索会产生数千个结果。 (祝你好运搜索其中任何一个以找到它的来源)

无论如何,所有这些函数都定义在bltinmodule.c 函数以builtin_functionname 开头

内置来源:https://github.com/python/cpython/blob/master/Python/bltinmodule.c

对于内置类型: https://github.com/python/cpython/tree/master/Objects

【讨论】:

列表是对象/类型,而不是内置函数。你可以在listobject.cgithub.com/python/cpython/tree/master/Objects找到实现细节 dir 未在 C 中实现,因此不在该文件中。 寻找builtin pow in bltinmodule.c的实现,只找到一个无用的static PyObject * builtin_pow_impl(PyObject *module, PyObject *base, PyObject *exp, PyObject *mod) return PyNumber_Power(base, exp, mod); 。有没有一种简单的方法可以找到隐藏实际算法实现的位置?【参考方案4】:

iPython shell 让这一切变得简单:function? 将为您提供文档。 function?? 也显示了代码。但这仅适用于纯 python 函数。

那么您可以随时download (c)Python 的源代码。

如果您对核心功能的 Python 实现感兴趣,请查看 PyPy 源代码。

【讨论】:

PyPy 将 RPython 用于大多数内置内容,这些内容几乎可以与 C 一样低级,也可以与 Python 一样高级。通常介于两者之间。无论哪种情况,它都是静态类型的,所以它不是真正的 Python。 查看早期项目以查看内置函数的源代码:github.com/punchagan/cinspect【参考方案5】:

2 种方法,

    您可以使用help() 检查有关 sn-p 的使用情况 您可以使用inspect检查这些模块的隐藏代码

1) 检查:

使用 inpsect 模块来探索你想要的代码... 注意:您只能探索您已导入的模块(又名)包的代码

例如:

  >>> import randint  
  >>> from inspect import getsource
  >>> getsource(randint) # here i am going to explore code for package called `randint`

2) 帮助():

您可以简单地使用help() 命令获取有关内置函数及其代码的帮助。

例如: 如果您想查看 str() 的代码,只需输入 - help(str)

它会像这样返回,

>>> help(str)
Help on class str in module __builtin__:

class str(basestring)
 |  str(object='') -> string
 |
 |  Return a nice string representation of the object.
 |  If the argument is a string, the return value is the same object.
 |
 |  Method resolution order:
 |      str
 |      basestring
 |      object
 |
 |  Methods defined here:
 |
 |  __add__(...)
 |      x.__add__(y) <==> x+y
 |
 |  __contains__(...)
 |      x.__contains__(y) <==> y in x
 |
 |  __eq__(...)
 |      x.__eq__(y) <==> x==y
 |
 |  __format__(...)
 |      S.__format__(format_spec) -> string
 |
 |      Return a formatted version of S as described by format_spec.
 |
 |  __ge__(...)
 |      x.__ge__(y) <==> x>=y
 |
 |  __getattribute__(...)
-- More  --

【讨论】:

OP特别想看代码,帮助只提供文档。【参考方案6】:

相当未知的资源是 Python Developer Guide。

在(有点)最近的 GH issue 中,添加了一个新章节来解决您提出的问题:CPython Source Code Layout。如果有什么变化,该资源也将得到更新。

【讨论】:

很好的参考!谢谢【参考方案7】:

让我们直接回答你的问题。

寻找内置 Python 函数的源代码?

源码位于cpython/Python/bltinmodule.c

要在 GitHub 存储库中查找源代码,请转到 here。可以看到所有的内置函数都以builtin_&lt;name_of_function&gt;开头,比如sorted()builtin_sorted中实现。

为了您的快乐,我将发布sorted() 的implementation:

builtin_sorted(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)

    PyObject *newlist, *v, *seq, *callable;

    /* Keyword arguments are passed through list.sort() which will check
       them. */
    if (!_PyArg_UnpackStack(args, nargs, "sorted", 1, 1, &seq))
        return NULL;

    newlist = PySequence_List(seq);
    if (newlist == NULL)
        return NULL;

    callable = _PyObject_GetAttrId(newlist, &PyId_sort);
    if (callable == NULL) 
        Py_DECREF(newlist);
        return NULL;
    

    assert(nargs >= 1);
    v = _PyObject_FastCallKeywords(callable, args + 1, nargs - 1, kwnames);
    Py_DECREF(callable);
    if (v == NULL) 
        Py_DECREF(newlist);
        return NULL;
    
    Py_DECREF(v);
    return newlist;

您可能已经注意到,这不是 Python 代码,而是 C 代码。

【讨论】:

【参考方案8】:

正如@Jim 所述,文件组织描述为here。为便于发现而转载:

对于 Python 模块,典型的布局是:

Lib/<module>.py
Modules/_<module>.c (if there’s also a C accelerator module)
Lib/test/test_<module>.py
Doc/library/<module>.rst

对于仅扩展模块,典型的布局是:

Modules/<module>module.c
Lib/test/test_<module>.py
Doc/library/<module>.rst

对于内置类型,典型的布局是:

Objects/<builtin>object.c
Lib/test/test_<builtin>.py
Doc/library/stdtypes.rst

对于内置函数,典型的布局是:

Python/bltinmodule.c
Lib/test/test_builtin.py
Doc/library/functions.rst

一些例外:

builtin type int is at Objects/longobject.c
builtin type str is at Objects/unicodeobject.c
builtin module sys is at Python/sysmodule.c
builtin module marshal is at Python/marshal.c
Windows-only module winreg is at PC/winreg.c

【讨论】:

以上是关于查找内置 Python 函数的源代码?的主要内容,如果未能解决你的问题,请参考以下文章

Python - 在数字列表中查找最大数字

查找 python 内置函数的调用者

使用python中的内置函数查找3d距离

python 内置函数

python有多少内置函数

Python3.9的69个内置函数(内建函数)介绍,并附简单明了的示例代码