Finden Sie den Quellcode für integrierte Python-Funktionen?

142

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.?

user1073865
quelle

Antworten:

135

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 inspectModul verwenden, siehe Abschnitt Abrufen des Quellcodes in der Dokumentation von inspect.

Für integrierte Klassen und Methoden ist dies , da nicht so einfach inspect.getfileund inspect.getsourcewird eine Art Fehler zurück , die besagt , dass das Objekt eingebaut ist. Viele der integrierten Typen befinden sich jedoch im ObjectsUnterverzeichnis des Python-Quell-Trunks . Zum Beispiel finden Sie hier für die Umsetzung der enumerate - Klasse oder hier für die Umsetzung des listArt.

Chris
quelle
Können Sie ein Beispiel geben mit enumerate?
Benjamin
Wie wäre es mit dem Quellcode für "sortiert" nach dem OP? inspect.getsourcefile (sortiert) funktioniert natürlich nicht.
Quetzalcoatl
2
@Quetzalcoatl der Quellcode für sorted()ist in /Python/bltinmodule.c, obwohl es nur aufruft, list.sort()so dass die eigentliche Quelle in /Objects/listobject.c ist
Boris
35

Hier ist eine Kochbuchantwort zur Ergänzung der Antwort von @Chris . CPython ist zu GitHub gewechselt und das Mercurial-Repository wird nicht mehr aktualisiert:

  1. Installieren Sie ggf. Git.
  2. git clone https://github.com/python/cpython.git

  3. Der Code wird in ein Unterverzeichnis mit dem Namen cpython-> ausgechecktcd cpython

  4. Nehmen wir an, wir suchen nach der Definition von print()...
  5. egrep --color=always -R 'print' | less -R
  6. Aha! Siehe Python/bltinmodule.c->builtin_print()

Genießen.

Kevinarpe
quelle
21

Geben Sie hier die Bildbeschreibung ein

Ich musste ein wenig graben, um die Quelle des Folgenden zu finden, Built-in Functionsda 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.cFunktionen 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

user1767754
quelle
1
Eine Liste ist ein Objekt / Typ, keine eingebaute Funktion. Sie finden die Implementierungsdetails dafür in listobject.c github.com/python/cpython/tree/master/Objects
user1767754
19

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.

tback
quelle
1
PyPy verwendet RPython für die meisten integrierten Funktionen, die fast so niedrig wie C und fast so hoch wie Python sein können. Normalerweise liegt es dazwischen. In beiden Fällen ist es statisch typisiert, es ist also nicht wirklich Python.
2
Sehen Sie ein frühes Projekt zum Anzeigen des Quellcodes einer eingebauten Funktion: github.com/punchagan/cinspect
Thomas
8

2 Methoden,

  1. Sie können die Verwendung von Snippets mithilfe von überprüfen help()
  2. Sie können versteckten Code für diese Module mit überprüfen 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  --
Mohideen bin Mohammed
quelle
4
Das OP möchte sich speziell den Code ansehen, die Hilfe gibt nur Dokumentation.
0xc0de
6

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.

Dimitris Fasarakis Hilliard
quelle
1

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 theres 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
Mateen Ulhaq
quelle