web-dev-qa-db-fra.com

Recherche du code source pour les fonctions Python intégrées?)?

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

107
user1073865

Depuis Python est une source ouverte, vous pouvez lire le 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__ attribut. Vous pouvez également utiliser le module 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 puisque inspect.getfile et inspect.getsource retournera une erreur de type indiquant que l'objet est intégré. Cependant, bon nombre des types intégrés se trouvent dans le sous-répertoire Objects du répertoire Python . Par exemple, voir - ici pour l'implémentation de la classe d'énumération ou ici pour l'implémentation du type list.

107
Chris

Voici une réponse au livre de recettes à compléter @ Chris 'answer , CPython a été transféré 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 passera à 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()

Prendre plaisir.

30
kevinarpe

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

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

Si vous êtes intéressé par les implémentations Pythonic des fonctionnalités principales, regardez PyPy source.

17
tback

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 à la recherche de ceux qui trouveront 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 intégrés: https://github.com/python/cpython/tree/master/Objects

13
user1767754

2 méthodes,

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

1) inspecter:

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

pour 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 la commande help() pour obtenir de l'aide sur les fonctions intégrées ainsi que sur son code.

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

ça va revenir 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  --
7

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

Dans un numéro (un peu) récent de GH , un nouveau chapitre a été ajouté dans le but de répondre à la question que vous posez: Disposition du code source CPython . Si quelque chose devait changer, cette ressource serait également mise à jour.

6

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

Pour les modules Python, la présentation typique est la suivante:

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

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

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

Pour les types prédéfinis, la disposition typique est la suivante:

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

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

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
0
Mateen Ulhaq