230 votes

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

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

214voto

Chris Points 12438

Puisque Python est un logiciel libre, vous pouvez lire la version code source .

Pour savoir dans quel fichier un module ou une fonction particulière est implémenté, vous pouvez généralement imprimer le fichier __file__ . Vous pouvez également utiliser l'attribut inspect 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.getfile et inspect.getsource retournera une erreur de type indiquant que l'objet est intégré. Cependant, la plupart des types intégrés peuvent être trouvés dans le fichier Objects sous-répertoire du trunk source de Python . Par exemple, voir ici pour l'implémentation de la classe énumération ou ici pour la mise en œuvre de la list type.

0 votes

Pouvez-vous donner un exemple avec enumerate ?

0 votes

Suite à l'OP, que diriez-vous du code source de "sorted" ? bien sûr, inspect.getsourcefile(sorted) ne fonctionne pas.

4 votes

@Quetzalcoatl le code source de sorted() est en /Python/bltinmodule.c bien qu'il appelle simplement list.sort() donc la vraie source est dans /Objects/listobject.c

48voto

kevinarpe Points 2902

Voici la réponse d'un livre de cuisine pour compléter Réponse de @Chris CPython est passé sur GitHub et le dépôt 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 transféré 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. Aha ! Voir Python/bltinmodule.c -> builtin_print()

Profitez-en.

7 votes

bltinmodule . Arrrrrrrrrgh. Pourquoi ont-ils dû l'épeler si mal ? J'ai essayé une recherche rapide dans le système de fichiers pour builtin et je n'ai rien trouvé !

43voto

user1767754 Points 460

enter image description here

J'ai dû creuser un peu pour trouver la source de ce qui suit Built-in Functions car la recherche donnerait des milliers de résultats. (Bonne chance pour rechercher l'un de ces résultats et trouver sa source).

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

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

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

1 votes

Une liste est un objet/type, pas une fonction intégrée. Vous pouvez trouver les détails de l'implémentation de cette fonction dans listobject.c github.com/python/cpython/tree/master/Objects

0 votes

dir n'est pas implémenté en C, il n'est donc pas dans ce fichier.

26voto

tback Points 3282

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

Alors 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 à PyPy source.

1 votes

PyPy utilise RPython pour la plupart des fonctions intégrées, qui peuvent être d'un niveau presque aussi bas que le C à un niveau presque aussi élevé que Python. En général, il se situe entre les deux. Dans tous les cas, il s'agit d'un typage statique, donc ce n'est pas vraiment du Python.

2 votes

Voir un ancien projet pour visualiser le code source d'une fonction intégrée : github.com/punchagan/cinspect

16voto

2 méthodes,

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

1) inspecter :

utiliser inpsect module pour explorer le code que vous voulez... NOTE : vous pouvez explorer le code uniquement pour les modules (ou paquets) 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) help() :

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

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

il reviendra comme ceci,

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

10 votes

Le PO veut spécifiquement regarder le code, l'aide ne donne que de la documentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X