Trovare il codice sorgente per le funzioni Python integrate?


142

C'è un modo per vedere come funzionano le funzioni integrate in Python? Non intendo solo come usarli, ma anche come sono stati costruiti, qual è il codice dietro ordinamento o enumerazione ecc ...?

Risposte:


135

Poiché Python è open source è possibile leggere il codice sorgente .

Per scoprire in quale file è implementato un determinato modulo o funzione, di solito è possibile stampare l' __file__attributo. In alternativa, è possibile utilizzare il inspectmodulo, consultare la sezione Recupero del codice sorgente nella documentazione diinspect .

Per built-in classi e metodi questo non è così semplice in quanto inspect.getfilee inspect.getsourcerestituirà un errore di tipo che indica che l'oggetto è built-in. Tuttavia, molti dei tipi predefiniti si trovano nella Objectssottodirectory del trunk di origine Python . Ad esempio, vedere qui per l'implementazione della classe enumerata o qui per l'implementazione del listtipo.


Puoi fare un esempio con enumerate?
Benjamin,

seguendo l'OP, che ne dici del codice sorgente per "ordinato"? ovviamente, inspect.getsourcefile (ordinato) non funziona.
Quetzalcoatl

2
@Quetzalcoatl il codice sorgente per sorted()è in /Python/bltinmodule.c anche se chiama solo list.sort()quindi la fonte reale è in /Objects/listobject.c
Boris

35

Ecco una risposta libro di cucina per integrare risposta @ Chris , CPython si è trasferito in GitHub e il repository Mercurial non verrà più aggiornato:

  1. Installa Git se necessario.
  2. git clone https://github.com/python/cpython.git

  3. Il codice effettuerà il checkout in una sottodirectory denominata cpython->cd cpython

  4. Diciamo che stiamo cercando la definizione di print()...
  5. egrep --color=always -R 'print' | less -R
  6. Aha! Vedi Python/bltinmodule.c->builtin_print()

Godere.


22

inserisci qui la descrizione dell'immagine

Ho dovuto scavare un po 'per trovare la fonte di quanto segue Built-in Functions poiché la ricerca avrebbe prodotto migliaia di risultati. (Buona fortuna a cercare uno di quelli per trovare dove si trova la fonte)

Ad ogni modo, tutte quelle funzioni sono definite in bltinmodule.cFunzioni che iniziano conbuiltin_{functionname}

Fonte integrata: https://github.com/python/cpython/blob/master/Python/bltinmodule.c

Per i tipi integrati: https://github.com/python/cpython/tree/master/Objects


1
Un elenco è un oggetto / tipo, non una funzione incorporata. Puoi trovare i dettagli di implementazione per questo in listobject.c github.com/python/cpython/tree/master/Objects
user1767754

19

La shell iPython lo rende facile: function?ti fornirà la documentazione. function??mostra anche il codice. MA questo funziona solo per le funzioni di puro pitone.

Quindi puoi sempre scaricare il codice sorgente per (c) Python.

Se sei interessato alle implementazioni pitone delle funzionalità di base, dai un'occhiata alla fonte PyPy .


1
PyPy usa RPython per la maggior parte delle cose incorporate, che possono essere quasi di livello inferiore come C a un livello quasi uguale a Python. Di solito è nel mezzo. In entrambi i casi è tipicamente statico, quindi non è proprio Python.

2
Guarda un progetto iniziale per visualizzare il codice sorgente di una funzione integrata: github.com/punchagan/cinspect
Thomas

8

2 metodi,

  1. Puoi controllare l'utilizzo dello snippet usando help()
  2. puoi controllare il codice nascosto per quei moduli usando inspect

1) ispezionare:

usa il modulo inpsect per esplorare il codice che desideri ... NOTA: puoi esplorare il codice solo per i pacchetti di moduli (aka) che hai importato

per esempio:

  >>> import randint  
  >>> from inspect import getsource
  >>> getsource(randint) # here i am going to explore code for package called `randint`

2) help ():

puoi semplicemente usare il help()comando per ottenere aiuto sulle funzioni integrate e sul suo codice.

per esempio: se vuoi vedere il codice per str (), digita semplicemente - help(str)

tornerà così,

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

4
L'OP vuole specificamente esaminare il codice, la guida fornisce solo documentazione.
0xc0de,


1

Come menzionato da @Jim, l'organizzazione dei file è descritta qui . Riprodotto per facilità di scoperta:

Per i moduli Python, il layout tipico è:

Lib/<module>.py
Modules/_<module>.c (if theres also a C accelerator module)
Lib/test/test_<module>.py
Doc/library/<module>.rst

Per i moduli di sola estensione, il layout tipico è:

Modules/<module>module.c
Lib/test/test_<module>.py
Doc/library/<module>.rst

Per i tipi predefiniti, il layout tipico è:

Objects/<builtin>object.c
Lib/test/test_<builtin>.py
Doc/library/stdtypes.rst

Per le funzioni integrate, il layout tipico è:

Python/bltinmodule.c
Lib/test/test_builtin.py
Doc/library/functions.rst

Alcune eccezioni:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.