Ho bisogno di compilare una stringa di input (da un database) come una funzione ed eseguirla. Questo è il metodo che attualmente uso:Come compilare il testo come una funzione usando AST?
dire che ho già ho questa funzione definita:
def foo():
print "Yo foo! I am a function!"
E la stringa ho letto dal database dice che dovrei chiamare questa funzione:
string_from_db = "foo()"
Quindi formulo una funzione (il cui nome posso controllare) che restituisce la funzione che ho letto dal database:
my_func_string = "def doTheFunc():\n\t return " + string_from_db
Ora posso compilare la corda, e impostarlo su un nome di funzione che uso in seguito per l'elaborazione:
exec my_func_string
processor = doTheFunc
posso chiamare successivamente lanciando processor()
che esclama: Yo foo! I am a function!
La mia domanda: Sopra questo pezzo di codice v'è un commento (lasciato da uno sviluppatore a lungo perduto): "sostituzione potenziale"
###############################################################
# The following method for getting a function out of the text #
# in the database could potentially be replaced by using #
# Python's ast module to obtain an abstract syntax tree and #
# put it inside of a function node #
###############################################################
mi piacerebbe sapere di più su questo Ho dato un'occhiata a AST, ma sono molto confuso su come può aiutarmi a fare quello che sto già facendo con il codice sopra.
- Come posso ottenere la stessa cosa utilizzando AST? O dove può AST aiutarmi in questo processo?
- L'implementazione utilizza AST meglio e perché?
Sii nei regni della magia oscura. –
Se si conoscono le stringhe per essere sicuri, non c'è motivo di usare 'ast' su' exec() '. L'interprete Python implementa già l'analisi del codice sorgente Python in oggetti funzione, perché replicarlo? – millimoose
@millimoose Ho finito con l'implementazione di 'exec', perché so che le mie corde sono sicure. Tuttavia, questa domanda mi ha illuminato su usi migliori per 'ast'. Grazie! – dinkelk