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

时间:2011-12-22 19:02:09

标签: python python-internals

有没有办法看看内置函数在python中是如何工作的?我不是说如何使用它们,而是它们是如何构建的, 排序 枚举背后的代码是什么等......?

8 个答案:

答案 0 :(得分:102)

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

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

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

答案 1 :(得分:27)

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

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

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

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

答案 2 :(得分:16)

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

然后你总是download(c)Python的源代码。

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

答案 3 :(得分:10)

enter image description here

我不得不挖掘一下以找到以下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

答案 4 :(得分:6)

2种方法,

  1. 您可以使用help()
  2. 检查有关代码段的使用情况
  3. 您可以使用inspect
  4. 检查这些模块的隐藏代码

    1)检查:

    使用 inpsect 模块探索您想要的代码... 注意:您只能浏览已导入的模块(又称)软件包的代码

    例如:

      >>> 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  --
    

答案 5 :(得分:5)

相当未知的资源是Python Developer Guide

在(有点)最近的GH issue中,添加了一个新章节来解决您提出的问题:CPython Source Code Layout。如果某些内容发生变化,该资源也会更新。

答案 6 :(得分:0)

如@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

答案 7 :(得分:0)

我们直接回答您的问题。

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

源代码位于Python/bltinmodule.c

要在GitHub存储库中找到源代码,请转到here。您会看到所有内置函数都以builtin_<name_of_function>开头,例如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代码。