¿Encuentra el código fuente para las funciones integradas de Python?


142

¿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:


135

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.


¿Puedes dar un ejemplo con enumerate?
Benjamin

siguiendo el OP, ¿qué tal el código fuente de "ordenado"? por supuesto, inspect.getsourcefile (ordenado) no funciona.
Quetzalcóatl

2
@Quetzalcoatl el código fuente para sorted()está en /Python/bltinmodule.c aunque solo llama list.sort()para que la fuente real esté en /Objects/listobject.c
Boris

35

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á:

  1. Instale Git si es necesario.
  2. git clone https://github.com/python/cpython.git

  3. El código pasará a un subdirectorio llamado cpython->cd cpython

  4. Digamos que estamos buscando la definición de print()...
  5. egrep --color=always -R 'print' | less -R
  6. ¡Ajá! Ver Python/bltinmodule.c->builtin_print()

Disfrutar.


21

ingrese la descripción de la imagen aquí

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


1
Una lista es un objeto / tipo, no una función integrada. Puede encontrar los detalles de implementación para eso en listobject.c github.com/python/cpython/tree/master/Objects
user1767754 del

19

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 .


1
PyPy usa RPython para la mayoría de las cosas integradas, que pueden ser de un nivel tan bajo como C a casi tanto como Python. Por lo general, está en el medio. En cualquier caso, está estáticamente escrito, por lo que no es realmente Python.

2
Vea un proyecto inicial para ver el código fuente de una función integrada
Thomas

8

2 métodos,

  1. Puede verificar el uso del fragmento utilizando help()
  2. puede verificar el código oculto para esos módulos usando 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  --

44
El OP específicamente quiere ver el código, la ayuda solo proporciona documentación.
0xc0de


1

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 theres 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.