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 ...?
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:
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 inspect
modulo, consultare la sezione Recupero del codice sorgente nella documentazione diinspect
.
Per built-in classi e metodi questo non è così semplice in quanto inspect.getfile
e inspect.getsource
restituirà un errore di tipo che indica che l'oggetto è built-in. Tuttavia, molti dei tipi predefiniti si trovano nella Objects
sottodirectory del trunk di origine Python . Ad esempio, vedere qui per l'implementazione della classe enumerata o qui per l'implementazione del list
tipo.
sorted()
è in /Python/bltinmodule.c anche se chiama solo list.sort()
quindi la fonte reale è in /Objects/listobject.c
Ecco una risposta libro di cucina per integrare risposta @ Chris , CPython si è trasferito in GitHub e il repository Mercurial non verrà più aggiornato:
git clone https://github.com/python/cpython.git
Il codice effettuerà il checkout in una sottodirectory denominata cpython
->cd cpython
print()
...egrep --color=always -R 'print' | less -R
Python/bltinmodule.c
->builtin_print()
Godere.
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.c
Funzioni 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
listobject.c
github.com/python/cpython/tree/master/Objects
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 .
2 metodi,
help()
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 --
Una risorsa sconosciuta è la Guida per gli sviluppatori di Python .
In un (piuttosto) recente problema GH , è stato aggiunto un nuovo capitolo per rispondere alla domanda che stai ponendo: CPython Source Code Layout . Se qualcosa dovesse cambiare, anche quella risorsa verrà aggiornata.
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 there’s 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
enumerate
?