Trouver le code source des fonctions Python intégrées?

142

Existe-t-il un moyen de voir comment les fonctions intégrées fonctionnent en python? Je ne veux pas dire simplement comment les utiliser, mais aussi comment ont-ils été construits, quel est le code derrière trié ou énuméré, etc.?

utilisateur1073865
la source

Réponses:

135

Puisque Python est open source, vous pouvez lire le code source .

Pour savoir dans quel fichier un module ou une fonction particulier est implémenté, vous pouvez généralement imprimer l' __file__attribut. Vous pouvez également utiliser le inspectmodule, voir la section Récupération du code source dans la documentation de inspect.

Pour les classes et méthodes intégrées, ce n'est pas si simple car inspect.getfileet inspect.getsourcerenverra une erreur de type indiquant que l'objet est intégré. Cependant, de nombreux types intégrés peuvent être trouvés dans le Objectssous-répertoire du coffre source Python . Par exemple, voir ici pour l'implémentation de la classe enumerate ou ici pour l'implémentation du listtype.

Chris
la source
Pouvez-vous donner un exemple avec enumerate?
Benjamin
suite à l'OP, qu'en est-il du code source pour «trié»? bien sûr, inspect.getsourcefile (trié) ne fonctionne pas.
Quetzalcoatl
2
@Quetzalcoatl le code source pour sorted()est dans /Python/bltinmodule.c bien qu'il appelle juste list.sort()pour que la source réelle soit dans /Objects/listobject.c
Boris
35

Voici une réponse de livre de recettes pour compléter la réponse de @Chris , CPython a déménagé sur GitHub et le référentiel Mercurial ne sera plus mis à jour:

  1. Installez Git si nécessaire.
  2. git clone https://github.com/python/cpython.git

  3. Le code sera extrait dans un sous-répertoire appelé cpython->cd cpython

  4. Disons que nous cherchons la définition de print()...
  5. egrep --color=always -R 'print' | less -R
  6. Ah! Voir Python/bltinmodule.c->builtin_print()

Prendre plaisir.

kevinarpe
la source
22

entrez la description de l'image ici

J'ai dû creuser un peu pour trouver la source des éléments suivants, Built-in Functionscar la recherche donnerait des milliers de résultats. (Bonne chance pour rechercher l'un de ceux-ci pour trouver où se trouve sa source)

Quoi qu'il en soit, toutes ces fonctions sont définies dans Les bltinmodule.cfonctions commencent parbuiltin_{functionname}

Source intégrée: https://github.com/python/cpython/blob/master/Python/bltinmodule.c

Pour les types intégrés: https://github.com/python/cpython/tree/master/Objects

user1767754
la source
1
Une liste est un objet / type, pas une fonction intégrée. Vous pouvez trouver les détails de mise en œuvre pour cela dans listobject.c github.com/python/cpython/tree/master/Objects
user1767754
19

Le shell iPython rend cela facile: function?vous donnera la documentation. function??montre également le code. MAIS cela ne fonctionne que pour les fonctions python pures.

Ensuite, vous pouvez toujours télécharger le code source du (c) Python.

Si vous êtes intéressé par les implémentations pythoniques des fonctionnalités de base, jetez un œil à la source PyPy .

tback
la source
1
PyPy utilise RPython pour la plupart des éléments intégrés, qui peuvent être presque aussi bas que C à presque aussi haut niveau que Python. C'est généralement entre les deux. Dans les deux cas, il est typé statiquement, donc ce n'est pas vraiment Python.
2
Voir un premier projet pour afficher le code source d'une fonction intégrée
Thomas
8

2 méthodes,

  1. Vous pouvez vérifier l'utilisation de l'extrait de code à l'aide de help()
  2. vous pouvez vérifier le code caché pour ces modules en utilisant inspect

1) inspecter:

utilisez le module inpsect pour explorer le code que vous voulez ... REMARQUE: vous ne pouvez explorer le code que pour les modules (aka) packages que vous avez importés

par exemple:

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

2) aide ():

vous pouvez simplement utiliser la help()commande pour obtenir de l'aide sur les fonctions intégrées ainsi que sur son code.

par exemple: si vous voulez voir le code de str (), tapez simplement - help(str)

ça reviendra comme ça,

>>> 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
la source
4
L'OP veut spécifiquement regarder le code, l'aide ne donne que de la documentation.
0xc0de
6

Le Guide du développeur Python est une ressource inconnue .

Dans un problème (quelque peu) récent de GH , un nouveau chapitre a été ajouté pour répondre à la question que vous vous posez: la disposition du code source CPython . Si quelque chose devait changer, cette ressource sera également mise à jour.

Dimitris Fasarakis Hilliard
la source
1

Comme mentionné par @Jim, l'organisation des fichiers est décrite ici . Reproduit pour faciliter la découverte:

Pour les modules Python, la disposition typique est:

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

Pour les modules d'extension uniquement, la disposition typique est:

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

Pour les types intégrés, la disposition typique est:

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

Pour les fonctions intégrées, la disposition typique est:

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

Quelques exceptions:

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
la source