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.?
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:
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 inspect
module, 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
renverra une erreur de type indiquant que l'objet est intégré. Cependant, de nombreux types intégrés peuvent être trouvés dans le Objects
sous-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 list
type.
sorted()
est dans /Python/bltinmodule.c bien qu'il appelle juste list.sort()
pour que la source réelle soit dans /Objects/listobject.c
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:
git clone https://github.com/python/cpython.git
Le code sera extrait dans un sous-répertoire appelé cpython
->cd cpython
print()
...egrep --color=always -R 'print' | less -R
Python/bltinmodule.c
->builtin_print()
Prendre plaisir.
J'ai dû creuser un peu pour trouver la source des éléments suivants, Built-in Functions
car 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.c
fonctions 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
listobject.c
github.com/python/cpython/tree/master/Objects
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 .
2 méthodes,
help()
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 --
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.
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 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:
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
enumerate
?