Finding the source code for built-in Python functions?

前端 未结 8 1645
一向
一向 2020-11-22 02:40

Is there a way to see how built in functions work in python? I don\'t mean just how to use them, but also how were they built, what is the code behind sorted

相关标签:
8条回答
  • 2020-11-22 02:46

    The iPython shell makes this easy: function? will give you the documentation. function?? shows also the code. BUT this only works for pure python functions.

    Then you can always download the source code for the (c)Python.

    If you're interested in pythonic implementations of core functionality have a look at PyPy source.

    0 讨论(0)
  • 2020-11-22 02:49

    Here is a cookbook answer to supplement @Chris' answer, CPython has moved to GitHub and the Mercurial repository will no longer be updated:

    1. Install Git if necessary.
    2. git clone https://github.com/python/cpython.git

    3. Code will checkout to a subdirectory called cpython -> cd cpython

    4. Let's say we are looking for the definition of print()...
    5. egrep --color=always -R 'print' | less -R
    6. Aha! See Python/bltinmodule.c -> builtin_print()

    Enjoy.

    0 讨论(0)
  • 2020-11-22 02:52

    2 methods,

    1. You can check usage about snippet using help()
    2. you can check hidden code for those modules using inspect

    1) inspect:

    use inpsect module to explore code you want... NOTE: you can able to explore code only for modules (aka) packages you have imported

    for eg:

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

    2) help():

    you can simply use help() command to get help about builtin functions as well its code.

    for eg: if you want to see the code for str() , simply type - help(str)

    it will return like this,

    >>> 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  --
    
    0 讨论(0)
  • 2020-11-22 03:01

    As mentioned by @Jim, the file organization is described here. Reproduced for ease of discovery:

    For Python modules, the typical layout is:

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

    For extension-only modules, the typical layout is:

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

    For builtin types, the typical layout is:

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

    For builtin functions, the typical layout is:

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

    Some exceptions:

    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
    
    0 讨论(0)
  • 2020-11-22 03:05

    Let's go straight to your question.

    Finding the source code for built-in Python functions?

    The source code is located at Python/bltinmodule.c

    To find the source code in the GitHub repository go here. You can see that all in-built functions start with builtin_<name_of_function>, for instance, sorted() is implemented in builtin_sorted.

    For your pleasure I'll post the implementation of sorted():

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

    As you may have noticed, that's not Python code, but C code.

    0 讨论(0)
  • 2020-11-22 03:10

    I had to dig a little to find the source of the following Built-in Functions as the search would yield thousands of results. (Good luck searching for any of those to find where it's source is)

    Anyway, all those functions are defined in bltinmodule.c Functions start with builtin_{functionname}

    Built-in Source: https://github.com/python/cpython/blob/master/Python/bltinmodule.c

    For Built-in Types: https://github.com/python/cpython/tree/master/Objects

    0 讨论(0)
提交回复
热议问题