Es scheint, als sollte es einfach sein, aber ich kann die Antwort nirgendwo finden - und auch nicht in der Lage, eine selbst abzuleiten. Wie verwandelst du eine nicht notierte Python-Funktion / Lambda in eine AST?
Hier ist, was ich gerne tun könnte.
%Vor%Die Meta-Bibliothek ermöglicht es Ihnen, die Quelle in vielen Fällen wiederherzustellen, mit einigen Ausnahmen wie Comprehensions und Lambdas.
> %Vor%Ihr Lambda-Ausdruck ist eine Funktion, die viele Informationen enthält, aber ich glaube nicht, dass ihr Quellcode zugeordnet ist. Ich bin mir nicht sicher, ob du das bekommst, was du willst.
Sie können AST nicht aus kompiliertem Bytecode generieren. Sie benötigen den Quellcode.
Wenn Sie nur auf die Funktion / Lambda zugreifen, haben Sie nur den kompilierten Python-Bytecode. Der genaue Python-AST kann nicht aus dem Bytecode rekonstruiert werden, da Informationsverlust im Kompilierungsprozess vorliegt. Aber Sie können den Bytecode analysieren und dafür ASTs erstellen. Es gibt einen solchen Analysator in GeniuSQL. Ich habe auch einen kleinen Proof of Concept, der Bytecode analysiert und daraus SQLAlchemy-Klauselelemente erstellt.
Der Prozess, den ich für die Analyse verwendet habe, ist folgender:
Ich habe meinen Proof of Concept und Beispiel eingefügt Code verwendet . Dies ist ein nicht sauberer, schnell gehackter Code, aber Sie können darauf aufbauen, wenn Sie möchten. Hinterlassen Sie eine Notiz, wenn Sie etwas Nützliches daraus machen möchten.
Im Allgemeinen können Sie nicht. Zum Beispiel ist %code% ein Ausdruck - wenn Sie ihn jedoch an eine Funktion oder Methode übergeben, ist das übergebene Argument nur die Zahl %code% , also keine Möglichkeit, den berechneten Ausdruck wiederherzustellen. Der Funktionsquellcode kann manchmal wiederhergestellt werden (allerdings nicht für %code% ), aber "ein nicht angeführter Python-Ausdruck" wird evaluiert , also erhält man nur das Objekt, das den Wert des Ausdrucks hat.
Welches Problem versuchen Sie zu lösen? Es kann andere, tragfähige Ansätze geben.
Bearbeiten : tx an das OP zur Klärung. Es gibt keine Möglichkeit, dies für %code% oder einige andere Fälle zu tun, aber wie ich bereits erwähnt habe, kann der Quellcode manchmal wiederhergestellt werden ...:
%Vor%%code% hebt %code% an, wenn es den Quellcode für das Objekt, an das Sie es übergeben, nicht erhalten kann. Ich schlage vor, dass Sie den Parsing- und Getsouce-Aufruf in eine Hilfsfunktion umwandeln, die eine Zeichenkette akzeptiert (und sie einfach analysiert) oder eine Funktion (und versucht, Quelltext darauf zu geben, was möglicherweise bessere Fehler in %code% ergibt).