Gibt es eine Möglichkeit zu sehen, wie integrierte Funktionen in Python funktionieren? Ich meine nicht nur, wie man sie benutzt, sondern auch, wie sie gebaut wurden, was ist der Code hinter dem Sortieren oder Aufzählen usw.?
Gibt es eine Möglichkeit zu sehen, wie integrierte Funktionen in Python funktionieren? Ich meine nicht nur, wie man sie benutzt, sondern auch, wie sie gebaut wurden, was ist der Code hinter dem Sortieren oder Aufzählen usw.?
Antworten:
Da Python Open Source ist, können Sie den Quellcode lesen .
Um herauszufinden, in welcher Datei ein bestimmtes Modul oder eine bestimmte Funktion implementiert ist, können Sie normalerweise das __file__
Attribut drucken . Alternativ können Sie das inspect
Modul verwenden, siehe Abschnitt Abrufen des Quellcodes in der Dokumentation von inspect
.
Für integrierte Klassen und Methoden ist dies , da nicht so einfach inspect.getfile
und inspect.getsource
wird eine Art Fehler zurück , die besagt , dass das Objekt eingebaut ist. Viele der integrierten Typen befinden sich jedoch im Objects
Unterverzeichnis des Python-Quell-Trunks . Zum Beispiel finden Sie hier für die Umsetzung der enumerate - Klasse oder hier für die Umsetzung des list
Art.
sorted()
ist in /Python/bltinmodule.c, obwohl es nur aufruft, list.sort()
so dass die eigentliche Quelle in /Objects/listobject.c ist
Hier ist eine Kochbuchantwort zur Ergänzung der Antwort von @Chris . CPython ist zu GitHub gewechselt und das Mercurial-Repository wird nicht mehr aktualisiert:
git clone https://github.com/python/cpython.git
Der Code wird in ein Unterverzeichnis mit dem Namen cpython
-> ausgechecktcd cpython
print()
...egrep --color=always -R 'print' | less -R
Python/bltinmodule.c
->builtin_print()
Genießen.
Ich musste ein wenig graben, um die Quelle des Folgenden zu finden, Built-in Functions
da die Suche Tausende von Ergebnissen liefern würde. (Viel Glück bei der Suche nach einer der Quellen)
Wie auch immer, alle diese Funktionen sind in bltinmodule.c
Funktionen definiert, die mit beginnenbuiltin_{functionname}
Eingebaute Quelle: https://github.com/python/cpython/blob/master/Python/bltinmodule.c
Für integrierte Typen: https://github.com/python/cpython/tree/master/Objects
listobject.c
github.com/python/cpython/tree/master/Objects
Die iPython- Shell macht dies einfach: function?
Sie erhalten die Dokumentation. function??
zeigt auch den Code. ABER dies funktioniert nur für reine Python-Funktionen.
Dann können Sie jederzeit den Quellcode für (c) Python herunterladen .
Wenn Sie an pythonischen Implementierungen der Kernfunktionalität interessiert sind, schauen Sie sich die PyPy- Quelle an.
2 Methoden,
help()
inspect
1) inspizieren:
Verwenden Sie das inpsect- Modul, um den gewünschten Code zu untersuchen ... HINWEIS: Sie können den Code nur für Module (auch bekannt als) Pakete untersuchen, die Sie importiert haben
für zB:
>>> import randint
>>> from inspect import getsource
>>> getsource(randint) # here i am going to explore code for package called `randint`
2) help ():
Sie können einfach den help()
Befehl verwenden, um Hilfe zu den integrierten Funktionen sowie zum Code zu erhalten.
Zum Beispiel: Wenn Sie den Code für str () sehen möchten, geben Sie einfach - ein help(str)
es wird so zurückkehren,
>>> 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 --
Eine völlig unbekannte Ressource ist das Python Developer Guide .
In einer (etwas) aktuellen GH- Ausgabe wurde ein neues Kapitel hinzugefügt, um die von Ihnen gestellte Frage zu beantworten: CPython-Quellcode-Layout . Sollte sich etwas ändern, wird diese Ressource ebenfalls aktualisiert.
Wie durch @ Jim erwähnt, wird die Dateiorganisation beschrieben hier . Wiedergabe zur leichteren Entdeckung:
Für Python-Module lautet das typische Layout:
Lib/<module>.py Modules/_<module>.c (if there’s also a C accelerator module) Lib/test/test_<module>.py Doc/library/<module>.rst
Für Nur-Erweiterungsmodule lautet das typische Layout:
Modules/<module>module.c Lib/test/test_<module>.py Doc/library/<module>.rst
Für eingebaute Typen lautet das typische Layout:
Objects/<builtin>object.c Lib/test/test_<builtin>.py Doc/library/stdtypes.rst
Für integrierte Funktionen lautet das typische Layout:
Python/bltinmodule.c Lib/test/test_builtin.py Doc/library/functions.rst
Einige Ausnahmen:
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
?