Ich muss eine Eingabezeichenfolge (aus einer Datenbank) als eine Funktion kompilieren und ausführen. Dies ist die Methode, die ich zur Zeit verwenden:Wie kompiliere ich Text als Funktion mit AST?
sagen, ich habe bereits diese Funktion definiert:
def foo():
print "Yo foo! I am a function!"
Und die Zeichenfolge ich aus der Datenbank eingelesen sagt sollte ich diese Funktion aufrufen:
string_from_db = "foo()"
ich bilde dann eine Funktion (dessen Namen ich steuern kann), die die Funktion zurückgibt ich aus der Datenbank eingelesen:
my_func_string = "def doTheFunc():\n\t return " + string_from_db
Jetzt kompilieren ich die Zeichenfolge, und legen Sie es auf einen Funktionsnamen ich später für die Verarbeitung verwenden:
exec my_func_string
processor = doTheFunc
ich es später nennen kann processor()
, indem Sie die ausruft: Yo foo! I am a function!
Meine Frage: Above dieses Stück Code gibt es einen Kommentar (durch einen lange verlorenen Entwickler links): „potentiellen Ersatz“
###############################################################
# 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 #
###############################################################
Ich mag würde mehr darüber wissen Ich habe mir AST angesehen, aber ich bin sehr verwirrt darüber, wie es mir helfen kann, das zu tun, was ich bereits mit dem obigen Code mache.
- Wie kann ich dasselbe mit AST erreichen? Oder wo kann AST mir dabei helfen?
- Ist die Implementierung mit AST besser, und warum?
Ihr seid im Reich der dunklen Magie. –
Wenn Sie die Zeichenfolgen als sicher kennen, gibt es keinen Grund, 'ast' über' exec() 'zu verwenden. Der Python-Interpreter implementiert bereits das Parsen von Python-Quellcode in Funktionsobjekte, warum replizieren? – millimoose
@millimoose Ich bin mit der 'exec'-Implementierung gegangen, da ich weiß, dass meine Strings sicher sind. Diese Frage hat mich jedoch zu besseren Verwendungen für 'ast' erleuchtet. Vielen Dank! – dinkelk