Python Language
Accesso al codice sorgente e al bytecode Python
Ricerca…
Visualizza il bytecode di una funzione
L'interprete Python compila il codice in bytecode prima di eseguirlo sulla macchina virtuale Python (vedi anche What bytecode python ? .
Ecco come visualizzare il bytecode di una funzione Python
import dis
def fib(n):
if n <= 2: return 1
return fib(n-1) + fib(n-2)
# Display the disassembled bytecode of the function.
dis.dis(fib)
La funzione dis.dis
nel modulo dis restituirà un bytecode decompilato della funzione passata ad esso.
Esplorazione dell'oggetto codice di una funzione
CPython consente l'accesso all'oggetto codice per un oggetto funzione.
L'oggetto __code__
contiene il codice byte ( co_code
) non co_code
della funzione e altre informazioni quali costanti e nomi di variabili.
def fib(n):
if n <= 2: return 1
return fib(n-1) + fib(n-2)
dir(fib.__code__)
def fib(n):
if n <= 2: return 1
return fib(n-1) + fib(n-2)
dir(fib.__code__)
Mostra il codice sorgente di un oggetto
Oggetti che non sono integrati
Per stampare il codice sorgente di un oggetto Python usa inspect
. Si noti che questo non funzionerà per gli oggetti built-in né per gli oggetti definiti in modo interattivo. Per questi avrai bisogno di altri metodi spiegati più tardi.
Ecco come stampare il codice sorgente del metodo randint
dal modulo random
:
import random
import inspect
print(inspect.getsource(random.randint))
# Output:
# def randint(self, a, b):
# """Return random integer in range [a, b], including both end points.
# """
#
# return self.randrange(a, b+1)
Per stampare solo la stringa della documentazione
print(inspect.getdoc(random.randint))
# Output:
# Return random integer in range [a, b], including both end points.
Stampa il percorso completo del file in cui è definito il metodo random.randint
:
print(inspect.getfile(random.randint))
# c:\Python35\lib\random.py
print(random.randint.__code__.co_filename) # equivalent to the above
# c:\Python35\lib\random.py
Oggetti definiti in modo interattivo
Se un oggetto è definito in modo interattivo, l' inspect
non può fornire il codice sorgente ma è possibile utilizzare invece dill.source.getsource
# define a new function in the interactive shell
def add(a, b):
return a + b
print(add.__code__.co_filename) # Output: <stdin>
import dill
print dill.source.getsource(add)
# def add(a, b):
return a + b
Oggetti built-in
Il codice sorgente per le funzioni built-in di Python è scritto in c e può essere consultato solo guardando il codice sorgente di Python (ospitato su Mercurial o scaricabile da https://www.python.org/downloads/source/) .
print(inspect.getsource(sorted)) # raises a TypeError
type(sorted) # <class 'builtin_function_or_method'>