Gibt es eine Möglichkeit programmgesteuert Python-Bytecode zu generieren?

abstract-syntax-tree bytecode dsl expression-trees python

Frage

Ich möchte mit dem Python-Interpreter herumhacken und versuchen, ein kleines DSL zu erstellen. Gibt es ein Modul, in dem ich so etwas wie diesen theoretischen Code machen kann (ähnlich wie LINQ-Expression-Bäume)?

expression_tree = Function(
    Print(
        String('Hello world!')
    )
 )
compile_to_bytecode(expression_tree)

Oder wäre es einfacher, Python-Quellcode zu generieren? Könnte dies mit C oder SWIG oder Cython einfacher gemacht werden?

Akzeptierte Antwort

Das Arbeiten über ast und das Kompilieren des Baumes in Bytecode, wie eine andere Antwort nahe legt, ist wahrscheinlich am einfachsten; Quellen erzeugen und kompilieren, fast so gut.

Um jedoch Ansätze auf niedrigerer Ebene zu erkunden, sehen Sie sich die Links von dieser Seite an . Ich habe das Byte-Play besonders nützlich gefunden (derzeit funktioniert es nicht mit 2.6 oder 3. *, nur 2.4 oder 2.5, aber ich denke, es sollte einfach sein, es für 2.6 zu beheben, wie es in seinem Tracker bereits besprochen wird). Ich habe Phil Ebys BytecodeAssembler mit ähnlichem Funktionsumfang nicht verwendet, aber angesichts des Rufs des Autors bin ich mir sicher, dass es sich lohnt, es auszuprobieren!


Beliebte Antwort

In Python 2.x, würden Sie dies in der Regel Ansatz mit dem compiler - ast Modul und sein ast -Submodul (aber beachten Sie, dieses Modul ab Version 2.6 veraltet ist). In Python 3.X würden Sie nur ast .

Beide bieten eine compile() -Funktion, die von Quelle / AST zu "einem Code-Objekt, das von der Anweisung exec oder eval() ausgeführt werden kann".




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum