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 ...?
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 ...?
Odpowiedzi:
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ć inspect
modułu, zobacz sekcję Pobieranie kodu źródłowego w dokumentacji inspect
.
W przypadku klas i metod wbudowanych nie jest to takie proste, ponieważ inspect.getfile
i inspect.getsource
zwróci błąd typu informujący, że obiekt jest wbudowany. Jednak wiele typów wbudowanych można znaleźć w Objects
podkatalogu pnia źródłowego języka Python . Na przykład zobacz tutaj implementację klasy wyliczeniowej lub tutaj implementację list
typu.
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
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:
git clone https://github.com/python/cpython.git
Kod przejdzie do podkatalogu o nazwie cpython
->cd cpython
print()
...egrep --color=always -R 'print' | less -R
Python/bltinmodule.c
->builtin_print()
Cieszyć się.
Musiałem trochę poszperać, aby znaleźć źródło następujących danych, Built-in Functions
ponieważ 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.c
funkcjach 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
listobject.c
github.com/python/cpython/tree/master/Objects
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 .
2 metody,
help()
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 --
Dość nieznanym zasobem jest Podręcznik programisty języka Python .
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.
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 there’s 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
enumerate
?