¿Hay alguna manera de ver cómo funcionan las funciones integradas en Python? No me refiero solo a cómo usarlos, sino también a cómo se construyeron, ¿cuál es el código detrás de ordenarlos o enumerarlos, etc.?
¿Hay alguna manera de ver cómo funcionan las funciones integradas en Python? No me refiero solo a cómo usarlos, sino también a cómo se construyeron, ¿cuál es el código detrás de ordenarlos o enumerarlos, etc.?
Respuestas:
Como Python es de código abierto, puede leer el código fuente .
Para averiguar en qué archivo se implementa un módulo o función en particular, generalmente puede imprimir el __file__atributo. Alternativamente, puede usar el inspectmódulo, consulte la sección Recuperación del código fuente en la documentación de inspect.
Para las clases y métodos integrados, esto no es tan sencillo desde entonces inspect.getfiley inspect.getsourcedevolverá un error de tipo que indica que el objeto está integrado. Sin embargo, muchos de los tipos integrados se pueden encontrar en el Objectssubdirectorio del tronco fuente de Python . Por ejemplo, vea aquí para la implementación de la clase enumerate o aquí para la implementación del listtipo.
sorted()está en /Python/bltinmodule.c aunque solo llama list.sort()para que la fuente real esté en /Objects/listobject.c
Aquí hay una respuesta del libro de cocina para complementar la respuesta de @Chris , CPython se mudó a GitHub y el repositorio de Mercurial ya no se actualizará:
git clone https://github.com/python/cpython.git
El código pasará a un subdirectorio llamado cpython->cd cpython
print()...egrep --color=always -R 'print' | less -RPython/bltinmodule.c->builtin_print()Disfrutar.
Tuve que cavar un poco para encontrar la fuente de lo siguiente, Built-in Functionsya que la búsqueda arrojaría miles de resultados. (Buena suerte buscando cualquiera de esos para encontrar dónde está su fuente)
De todos modos, todas esas funciones están definidas en bltinmodule.cFunciones que comienzan conbuiltin_{functionname}
Fuente incorporada: https://github.com/python/cpython/blob/master/Python/bltinmodule.c
Para tipos integrados : https://github.com/python/cpython/tree/master/Objects
listobject.c github.com/python/cpython/tree/master/Objects
El shell de iPython lo hace fácil: function?le dará la documentación. function??muestra también el código. PERO esto solo funciona para funciones de Python puro.
Entonces siempre puede descargar el código fuente para (c) Python.
Si está interesado en implementaciones pitónicas de la funcionalidad central, eche un vistazo a la fuente PyPy .
2 métodos,
help()inspect 1) inspeccionar:
use el módulo inpsect para explorar el código que desee ... NOTA: puede explorar el código solo para módulos (aka) paquetes que haya importado
por ejemplo:
>>> import randint
>>> from inspect import getsource
>>> getsource(randint) # here i am going to explore code for package called `randint`
2) ayuda ():
simplemente puede usar el help()comando para obtener ayuda sobre las funciones integradas y su código.
por ejemplo: si desea ver el código para str (), simplemente escriba - help(str)
volverá así,
>>> 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 --
Un recurso bastante desconocido es la Guía para desarrolladores de Python .
En un problema de GH (algo) reciente , se agregó un nuevo capítulo para abordar la pregunta que está haciendo: Diseño de código fuente de CPython . Si algo cambia, ese recurso también se actualizará.
Como mencionó @Jim, la organización del archivo se describe aquí . Reproducido para facilitar el descubrimiento:
Para los módulos de Python, el diseño típico es:
Lib/<module>.py Modules/_<module>.c (if there’s also a C accelerator module) Lib/test/test_<module>.py Doc/library/<module>.rstPara módulos de solo extensión, el diseño típico es:
Modules/<module>module.c Lib/test/test_<module>.py Doc/library/<module>.rstPara los tipos incorporados, el diseño típico es:
Objects/<builtin>object.c Lib/test/test_<builtin>.py Doc/library/stdtypes.rstPara las funciones integradas, el diseño típico es:
Python/bltinmodule.c Lib/test/test_builtin.py Doc/library/functions.rstAlgunas excepciones
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?