Kompiliere python AST zur Methode

9

Ich habe mit ASTs in Python experimentiert. Ich möchte Methoden ändern, indem ich die ASTs zur Laufzeit transformiere.

Ich kann die Quelle einer vorkompilierten Methode mit inspect.getsource() und Ich kann den AST nach Bedarf ändern, indem ich AST-Besucher verwende.

Das ist wahrscheinlich ziemlich naiv, aber ich möchte in der Lage sein, den AST zu kompilieren und etwas Ähnliches zu tun:

%Vor%

Aber compile akzeptiert nur einen AST mit einem ast.Module als root. Gibt es eine Möglichkeit, entweder nur ein ast.FunctionDef zu kompilieren oder das Funktionscodeobjekt aus dem kompilierten (und ansonsten leeren) Modulcode abzurufen?

Irgendwelche Hinweise auf Informationen, die solche Dinge betreffen, wären willkommen. Die AST-Beispiele, die ich gesehen habe, befassen sich einfach mit einfachen Ausdrücken.

Ich erkannte, dass ich das Modul nur in einem Namensraum ausführen musste, dann hätte ich Zugriff auf die normale Struktur. Das Muster ist also:

%Vor%

Aber jetzt habe ich eine andere Frage: Wie fügt man dies in den normalen Python-Build-Prozess ein, so dass die Änderungen nur einmal ausgeführt und anschließend aus der .pyc-Datei geladen werden?

    
pwray 15.08.2011, 02:34
quelle

1 Antwort

1

Sie sollten keine neue Frage in Ihrer eigenen Antwort stellen, sondern eine separate Frage dafür erstellen.

Beachten Sie, dass Ihre erste und zweite Frage auch irgendwie widersprechen. Zuerst möchten Sie Dinge zur Laufzeit ausführen und später möchten Sie sie in eine Datei schreiben, damit Sie es nicht immer wieder tun müssen. Bitte geben Sie an, dass Ihr Endziel ist, damit wir genau wissen, was Sie wollen.

Es klingt, als könnten Sie genauso gut eine neue .py-Datei erstellen, nachdem Sie den Ast einer analysierten Datei geändert haben, wie in Parsen Sie eine .py-Datei, lesen Sie den AST, modifizieren Sie ihn und schreiben Sie den geänderten Quelltext zurück

Sie erhalten dann Ihre Pyc-Datei durch Kompilieren der neu erstellten Py-Datei.

    
koffie 15.08.2011 14:57
quelle