In generale, non è possibile. Ad esempio, 2 + 2
è un'espressione, ma se si passa a qualsiasi funzione o metodo, l'argomento che viene passato è solo il numero 4
, non c'è modo di recuperare l'espressione da cui è stato calcolato. A volte il codice sorgente della funzione può essere ripristinato (sebbene non per un lambda
), ma "un'espressione Python non quotata" ottiene valutato, quindi quello che ottieni è solo l'oggetto che è il valore dell'espressione.
Che problema stai cercando di risolvere? Potrebbero esserci altri approcci fattibili.
Modifica: tx all'OP per chiarire. Non c'è modo di farlo per lambda
o di alcuni altri casi d'angolo, ma come ho detto codice sorgente funzione a volte può essere recuperato ...:
import ast
import inspect
def f():
return 23
tree = ast.parse(inspect.getsource(f))
print ast.dump(tree)
inspect.getsource
solleva IOError
se non è possibile ottenere il codice sorgente per qualunque oggetto che stai passando. Vi suggerisco di racchiudere l'analisi e la chiamata getsource in una funzione ausiliaria che può accettare una stringa (e solo analizzarla) OPPURE una funzione (e prova a trovarla su di essa, probabilmente dando errori migliori nel caso IOError
).
fonte
2009-09-23 22:03:27
@Ants Aasma suggerimento era più vicina a quello che speravo, anche se sembra essere molto più coinvolti di quanto mi aspettassi e immagino diverse versioni di Python WRT più fragili (se cambia bytecode). Anche GeniuSQL sembra promettente. Off per fare qualche test! – Chris
Inoltre, ho appena trovato questo: http://code.activestate.com/recipes/442447/ – Chris