Ich schreibe eine Spielengine mit pygame und box2d, und im Zeichengenerator möchte ich den Code schreiben können, der bei Keydown-Ereignissen ausgeführt wird.
Mein Plan war, im Zeichengenerator einen Texteditor zu haben, mit dem Sie Code ähnlich dem schreiben können:
%Vor%Ich werde den Inhalt des Texteditors als Zeichenfolge abrufen und möchte, dass der Code in einer Methode in dieser Methode von Character ausgeführt wird:
%Vor%Was ist der beste Weg, das zu tun?
Sie können dazu die Methode eval(string)
verwenden.
eval(code, globals=None, locals=None)
Der Code ist nur Standard-Python-Code - das bedeutet, dass er immer noch korrekt eingerückt sein muss.
Für die Globals kann ein benutzerdefiniertes __builtins__
definiert werden, was für Sicherheitszwecke nützlich sein könnte.
Würde hello
auf die Konsole drucken. Sie können auch lokale und globale Variablen für den zu verwendenden Code angeben:
Sei aber vorsichtig. Jede Benutzereingabe wird ausgeführt. Überlegen Sie:
%Vor%Dafür gibt es verschiedene Möglichkeiten. Am einfachsten ist es, etwas zu tun wie:
%Vor%Das wird eine Ausnahme auslösen, anstatt Ihre Festplatte zu löschen. Während Ihr Programm Desktop ist, könnte dies ein Problem sein, wenn Leute Skripte neu verteilen, was ich mir vorstelle.
Hier ist ein Beispiel für die Verwendung von eval
ziemlich seltsam:
Was das in der Eval-Zeile bedeutet, ist:
contrivedExample
für das Skript). Der Konsument kann jetzt contrivedExample.hello()
aufrufen.) hi
als Verweis auf hello
Es stellt sich heraus (danke Kommentatoren!), dass Sie tatsächlich die exec
-Anweisung verwenden müssen. Große Oops. Die überarbeiteten Beispiele sind wie folgt:
exec
Definition (Das kommt mir bekannt vor!)
Exec ist eine Aussage:
exec "code" [in scope]
Wo scope ist ein Wörterbuch der lokalen und globalen Variablen. Wenn dies nicht angegeben ist, wird es im aktuellen Bereich ausgeführt.
Der Code ist nur Standard-Python-Code - das bedeutet, dass er immer noch korrekt eingerückt sein muss.
exec
Beispiel Würde hello
auf die Konsole drucken. Sie können auch lokale und globale Variablen für den zu verwendenden Code angeben:
exec
Sicherheitsbedenken Sei aber vorsichtig. Jede Benutzereingabe wird ausgeführt. Überlegen Sie:
%Vor% Wie auch von Kommentatoren bemerkt, ist print
eine Anweisung in allen Versionen von Python vor 3.0. In 2.6 kann das Verhalten durch Eingabe von from __future__ import print_statement
geändert werden. Andernfalls verwenden Sie:
Anstelle von:
%Vor% Wie andere darauf hingewiesen haben, können Sie den Text in eine Zeichenfolge laden und exec "codestring"
verwenden. Wenn es bereits in einer Datei enthalten ist, müssen Sie execfile nicht unbedingt laden.
Eine Leistungsbemerkung: Sie sollten es vermeiden, den Code mehrmals auszuführen, da das Parsen und Kompilieren der Python-Quelle ein langsamer Prozess ist. dh. nicht haben:
%Vor% Sie können dies etwas verbessern, indem Sie die Quelle in ein Code-Objekt kompilieren (mit compile()
und exec, oder besser, indem Sie eine Funktion erstellen, die Sie behalten und nur einmal erstellen. Entweder schreiben Sie den Benutzer " def my_handler (args ...) ", oder stelle es selbst vor und mache etwas wie:
Dann später:
%Vor%eval oder exec. Sie sollten unbedingt die Python-Bibliotheksreferenz lesen, bevor Sie programmieren.