¿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 inspect
mó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.getfile
y inspect.getsource
devolverá un error de tipo que indica que el objeto está integrado. Sin embargo, muchos de los tipos integrados se pueden encontrar en el Objects
subdirectorio del tronco fuente de Python . Por ejemplo, vea aquí para la implementación de la clase enumerate o aquí para la implementación del list
tipo.
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 -R
Python/bltinmodule.c
->builtin_print()
Disfrutar.
Tuve que cavar un poco para encontrar la fuente de lo siguiente, Built-in Functions
ya 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.c
Funciones 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>.rst
Para módulos de solo extensión, el diseño típico es:
Modules/<module>module.c Lib/test/test_<module>.py Doc/library/<module>.rst
Para los tipos incorporados, el diseño típico es:
Objects/<builtin>object.c Lib/test/test_<builtin>.py Doc/library/stdtypes.rst
Para las funciones integradas, el diseño típico es:
Python/bltinmodule.c Lib/test/test_builtin.py Doc/library/functions.rst
Algunas 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
?