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

142

Czy istnieje sposób, aby zobaczyć, jak działają funkcje wbudowane w Pythonie? Nie chodzi mi tylko o to, jak ich używać, ale także w jaki sposób zostały zbudowane, jaki jest kod za posortowaniem lub wyliczeniem itp ...?

user1073865
źródło

Odpowiedzi:

135

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

Aby dowiedzieć się, w jakim pliku jest zaimplementowany określony moduł lub funkcja, zazwyczaj można wydrukować __file__atrybut. Alternatywnie możesz użyć inspectmodułu, zobacz sekcję Pobieranie kodu źródłowego w dokumentacji inspect.

W przypadku klas i metod wbudowanych nie jest to takie proste, ponieważ inspect.getfilei inspect.getsourcezwróci błąd typu informujący, że obiekt jest wbudowany. Jednak wiele typów wbudowanych można znaleźć w Objectspodkatalogu pnia źródłowego języka Python . Na przykład zobacz tutaj implementację klasy wyliczeniowej lub tutaj implementację listtypu.

Chris
źródło
Czy możesz podać przykład enumerate?
Benjamin,
po OP, a co z kodem źródłowym dla „sortowania”? oczywiście inspect.getsourcefile (posortowany) nie działa.
Quetzalcoatl
2
@Quetzalcoatl kod źródłowy sorted()znajduje się w /Python/bltinmodule.c, chociaż po prostu wywołuje, list.sort()więc prawdziwe źródło znajduje się w /Objects/listobject.c
Boris
35

Oto odpowiedź z książki kucharskiej uzupełniająca odpowiedź @Chris , CPython przeniósł się do GitHub, a repozytorium Mercurial nie będzie już aktualizowane:

  1. W razie potrzeby zainstaluj Git.
  2. git clone https://github.com/python/cpython.git

  3. Kod przejdzie do podkatalogu o nazwie cpython->cd cpython

  4. Powiedzmy, że szukamy definicji print()...
  5. egrep --color=always -R 'print' | less -R
  6. Aha! Zobacz Python/bltinmodule.c->builtin_print()

Cieszyć się.

kevinarpe
źródło
22

wprowadź opis obrazu tutaj

Musiałem trochę poszperać, aby znaleźć źródło następujących danych, Built-in Functionsponieważ wyszukiwanie przyniosłoby tysiące wyników. (Powodzenia w szukaniu któregokolwiek z nich, aby dowiedzieć się, gdzie jest jego źródło)

W każdym razie wszystkie te funkcje są zdefiniowane w bltinmodule.cfunkcjach zaczynających się odbuiltin_{functionname}

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

W przypadku typów wbudowanych: https://github.com/python/cpython/tree/master/Objects

user1767754
źródło
1
Lista jest obiektem / typem, a nie funkcją wbudowaną. Szczegóły implementacji można znaleźć na listobject.c github.com/python/cpython/tree/master/Objects
user1767754
19

Plik Ipython powłoka sprawia, że to proste: function?daje dokumentację. function??pokazuje również kod. ALE to działa tylko dla czystych funkcji Pythona.

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

Jeśli interesują Cię implementacje podstawowych funkcji w języku Python, zajrzyj do źródła PyPy .

tback
źródło
1
PyPy używa RPythona do większości wbudowanych rzeczy, które mogą być prawie tak niskie jak C do prawie tak wysokiego poziomu jak Python. Zwykle jest pomiędzy. W obu przypadkach jest on wpisywany statycznie, więc tak naprawdę nie jest to Python.
2
Zobacz wczesny projekt do przeglądania kodu źródłowego funkcji wbudowanej: github.com/punchagan/cinspect
Thomas
8

2 metody,

  1. Możesz sprawdzić wykorzystanie fragmentu kodu za pomocą help()
  2. możesz sprawdzić ukryty kod dla tych modułów za pomocą inspect

1) sprawdzić:

użyj modułu inpsect do eksploracji kodu, który chcesz ... UWAGA: możesz eksplorować kod tylko dla modułów (czyli pakietów), które zaimportowałeś

na przykład:

  >>> 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ć help() polecenia, aby uzyskać pomoc dotyczącą wbudowanych funkcji, a także ich kodu.

na przykład: jeśli chcesz zobaczyć kod dla 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  --
Mohideen bin Mohammed
źródło
4
OP konkretnie chce przyjrzeć się kodowi, pomoc daje tylko dokumentację.
0xc0de
1

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

Typowy układ modułów Pythona to:

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

W przypadku modułów tylko rozszerzających typowy układ to:

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

W przypadku typów wbudowanych typowy układ to:

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

W przypadku 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
Mateen Ulhaq
źródło