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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow