Znajdowanie kodu źródłowego wbudowanych funkcji Pythona?

Czy istnieje sposób, aby zobaczyć, jak wbudowane funkcje działają w Pythonie? Nie chodzi mi tylko o to, jak z nich korzystać, ale także o to, jak zostały zbudowane, co kryje się za kodemsortowane lub wylicz itd...?

Author: Cœur, 2011-12-22

8 answers

Ponieważ Python jest open source możesz przeczytać kod źródłowy.

Aby dowiedzieć się, w jakim pliku zaimplementowany jest dany moduł lub funkcja, zwykle można wydrukować atrybut __file__. Alternatywnie możesz użyć modułu inspect, patrz Sekcja pobieranie kodu źródłowego w dokumentacji inspect.

Dla Wbudowanych klas i metod nie jest to tak proste, ponieważ inspect.getfile i inspect.getsource zwrócą błąd typu stwierdzający, że obiekt jest wbudowany. Jednakże, wiele wbudowanych typów można znaleźć w Objects podkatalog źródłowego truna Pythona . Na przykład, zobacz tutaj dla implementacji klasy enumerate lub tutaj dla implementacji typu list.

 148
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-19 04:11:37

Oto odpowiedź na książkę kucharską jako uzupełnienie @Chris' answer , CPython został przeniesiony na GitHub i repozytorium Mercurial nie będzie już aktualizowane:

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

  3. Kod zostanie przesłany do podkatalogu o nazwie cpython -> cd cpython

  4. powiedzmy, że szukamy definicji print()...
  5. egrep --color=always -R 'print' | less -R
  6. Aha! Zobacz też Python/bltinmodule.c -> builtin_print()
Smacznego.
 40
Author: kevinarpe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 20:06:25

Tutaj wpisz opis obrazka

Musiałem trochę pokopać, aby znaleźć źródło następujących Built-in Functions, ponieważ wyszukiwanie przyniosłoby tysiące wyników. (Powodzenia w szukaniu któregokolwiek z nich, aby znaleźć źródło)

W każdym razie wszystkie te funkcje są zdefiniowane w bltinmodule.c Funkcje zaczynają się od builtin_{functionname}

Wbudowane źródło: https://github.com/python/cpython/blob/master/Python/bltinmodule.c

Do wbudowania Rodzaje: https://github.com/python/cpython/tree/master/Objects

 28
Author: user1767754,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Powłoka iPython ułatwia to: function? da ci dokumentację. function?? pokazuje również kod. Ale to działa tylko dla czystych funkcji Pythona.

Wtedy zawsze możesz pobrać kod źródłowy Pythona (C).

Jeśli interesują Cię implementacje pythoniczne podstawowej funkcjonalności, zajrzyj do PyPy source.

 20
Author: tback,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-22 19:10:35

2 metody,

  1. Możesz sprawdzić użycie o snippecie używając help()
  2. Możesz sprawdzić ukryty kod dla tych modułów za pomocą inspect

1) inspect:

Użyj modułu inpsect, aby zbadać kod, który chcesz... Uwaga: możesz przeglądać kod tylko dla zaimportowanych pakietów modułów (aka)

Dla NP:

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

2) Pomoc():

Możesz po prostu użyć polecenia help(), aby uzyskać pomoc dotyczącą built funkcje, jak również jego kod.

Dla eg: jeśli chcesz zobaczyć kod str() , po prostu wpisz - help(str)

Powróci w ten sposób,

>>> 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  --
 9
Author: Mohideen bin Mohammed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-05 13:00:13

Dość nieznanym zasobem jest Python Developer Guide .

W (nieco) niedawnym wydaniu GH dodano nowy rozdział, aby odpowiedzieć na pytanie, które zadajesz: Układ kodu źródłowego CPython . Jeśli coś się zmieni, ten zasób również zostanie zaktualizowany.

 6
Author: Dimitris Fasarakis Hilliard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-06 09:56:00

Jak wspomniał @ Jim, organizacja plików jest opisana tutaj . Odtworzony dla ułatwienia odkrycia:

Dla modułów Pythona typowy układ to:

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

Dla modułów tylko z rozszerzeniami, typowy układ to:

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

Dla typów wbudowanych typowy układ to:

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

Dla funkcji wbudowanych typowy układ to:

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

Niektóre wyjątki:

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
 3
Author: Mateen Ulhaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-29 06:28:51

Przejdźmy od razu do twojego pytania.

Znajdowanie kodu źródłowego wbudowanych funkcji Pythona?

Kod źródłowy znajduje się pod adresem Python/bltinmodule.c

Aby znaleźć kod źródłowy w repozytorium GitHub przejdź tutaj . Możesz zobaczyć, że wszystkie wbudowane funkcje zaczynają się od builtin_<name_of_function>, na przykład, {[3] } jest zaimplementowane w builtin_sorted.

Dla Twojej przyjemności zamieszczę implementację z 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;
}

Jak zapewne zauważyliście, to nie jest kod Pythona, ale C kod.

 0
Author: Guzman Ojero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-16 23:18:51