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

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.


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.


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


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 .


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

4
L'OP veut spécifiquement regarder le code, l'aide ne donne que de la documentation.
0xc0de


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.