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 ...?
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
.
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:
git clone https://github.com/python/cpython.git
Le code passera à un sous-répertoire appelé cpython
-> cd cpython
print()
...egrep --color=always -R 'print' | less -R
Python/bltinmodule.c
-> builtin_print()
Prendre plaisir.
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.
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
2 méthodes,
help()
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 --
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.
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