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


142

有没有办法查看内置函数如何在python中工作?我不仅意味着如何使用它们,而且还意味着它们是如何构建的,排序枚举后的代码是什么?

Answers:


135

由于Python是开源的,因此您可以阅读源代码

要找出实现了特定模块或功能的文件,通常可以打印__file__属性。或者,您可以使用该inspect模块,请参阅的文档中的“ 检索源代码 ”部分inspect

对于内置的类和方法,这是不是这样,因为直白inspect.getfile,并inspect.getsource会返回一个类型错误,指出对象是内置。但是,可以Objects在Python源trunk子目录中找到许多内置类型。例如,看到这里的枚举类的实现或这里的执行list类型。


你能举个例子enumerate吗?
本杰明

在OP之后,“ sorted”的源代码如何?当然,inspect.getsourcefile(sorted)不起作用。
Quetzalcoatl '18年

2
@Quetzalcoatl的源代码sorted()/Python/bltinmodule.c中,尽管它只是调用了,list.sort()所以真正的源代码在/Objects/listobject.c中
Boris

35

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

  1. 如有必要,安装Git。
  2. git clone https://github.com/python/cpython.git

  3. 代码将签出到名为cpython-> 的子目录cd cpython

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

请享用。


21

在此处输入图片说明

我不得不花点时间找到以下内容的来源,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


1
列表是对象/类型,而不是内置函数。您可以在listobject.c github.com/python/cpython/tree/master/Objects
user1767754 '19

19

IPython的外壳让一切变得简单:function?给你的文档。function??同时显示代码。但是这仅适用于纯python函数。

然后,您随时可以下载(c)Python的源代码。

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


1
PyPy将RPython用于大多数内置的东西,这些东西的底层几乎与C一样低,几乎与Python一样高。通常介于两者之间。无论哪种情况,它都是静态类型的,因此它并不是真正的Python。

2
请参阅早期项目以查看内置函数的源代码:github.com/punchagan/cinspect
Thomas

8

2种方法

  1. 您可以使用查看有关代码段的用法 help()
  2. 您可以使用以下命令检查这些模块的隐藏代码 inspect

1)检查:

使用inpsect模块来浏览所需的代码... 注意:您只能浏览已导入的模块(aka)软件包的代码

例如:

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

2)help():

您只需使用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  --

4
OP特别希望查看代码,帮助仅提供文档。
0xc0de


1

如@Jim所述,此处描述了文件组织。为便于发现而复制:

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

Lib/<module>.py
Modules/_<module>.c (if theres 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.