2009-04-22 8 views
9

duplicati di ..Python riflessione - Posso usare questo per ottenere il codice sorgente di una definizione di metodo


I avere una definizione di metodo che è successo completamente funzionante, ma vorrei modificarlo in runtime.

per esempio: Se ho un metodo

def sayHello(): 
    print "Hello" 

tipo (sayHello) mi dà la 'tipo di funzione' risposta. Potrò ottenere la stringa del codice sorgente di questo oggetto funzione. È considerato un problema di sicurezza?

+3

Non si può fare questo. Duplicato: http://stackoverflow.com/questions/427453/how-can-i-get-the-code-of-python-function; http://stackoverflow.com/questions/334851/print-the-code-which-defined-a-lambda-function; http://stackoverflow.com/questions/399991/python-how-do-you-get-python-to-write-down-the-code-of-a-function-it-has-in-memo –

+0

It's Python : hai già la fonte. –

+3

Consiglio vivamente di fare un'altra domanda con maggiori dettagli. Ho la sensazione più divertente che quello che vuoi veramente possa richiedere solo chiusure/decoratori, ma poiché tutto ciò che hai chiesto è il codice sorgente di stampa (e provi a modificarlo in qualche modo) riceverai risposte deludenti. –

risposta

2

sayHello.func_code.co_code restituisce una stringa che, a mio avviso, contiene il codice compilato del metodo. Poichè Python sta compilando internamente il codice con il bytecode della macchina virtuale, questo potrebbe essere tutto ciò che rimane.

È possibile smontarlo, però:

import dis 

def sayHello(): 
    print "hello" 

dis.dis(sayHello) 

Questo stampa:

 
    1   0 LOAD_CONST    1 ('hello') 
       3 PRINT_ITEM 
       4 PRINT_NEWLINE 
       5 LOAD_CONST    0 (None) 
       8 RETURN_VALUE 

Dai un'occhiata alla Decompyle per una de-compilatore.

0

Non esiste una funzione built-in per ottenere il codice sorgente di una funzione, tuttavia, è possibile creare il proprio se si ha accesso al codice sorgente (sarebbe nella directory Python/lib).

17

utilizzare il modulo di ispezionare:

import inspect 
import mymodule 
print inspect.getsource(mymodule.sayHello) 

La funzione deve essere definita in un modulo che si importa.

Problemi correlati