Ich versuche, eine Funktion in Python zu machen, die das Äquivalent von Kompilierung tut(), aber auch lässt mich zurück, um die Original-Zeichenkette erhalten. Nennen wir diese beiden Funktionen comp() und dispomp() für Disambiguierungszwecke. Das heißt,Reversible Version der Kompilierung() in Python
a = comp("2 * (3 + x)", "", "eval")
eval(a, dict(x=3)) # => 12
decomp(a) # => "2 * (3 + x)"
Der zurückgegebene String nicht über identisch ("2 * (3 + x)" akzeptabel wäre) sein, aber es muss im Grunde das gleiche ("2 * x + sein 6 "wäre nicht).
Hier ist, was ich habe versucht, dass nicht Arbeit:
- ein Attribut Einstellung auf dem Code-Objekt durch Kompilierung zurückgegeben. Sie können keine benutzerdefinierten Attribute für Codeobjekte festlegen.
- Subclassing-Code, so kann ich das Attribut hinzufügen. Code kann nicht unterklassifiziert werden.
- Festlegen eines WeakKeyDictionary Mapping-Code up-Objekte auf die ursprünglichen Strings. Code-Objekte können nicht schwach referenziert werden.
Hier ist, was funktioniert, mit Fragen:
- im ursprünglichen Code Zeichenfolge Passing für die Dateinamen() zu kompilieren. Allerdings verliere ich die Fähigkeit, dort tatsächlich einen Dateinamen zu behalten, den ich auch gerne machen würde.
- Halten eines realen Wörterbuch Zuordnung von Code-Objekten zu Strings. Dies führt zu Speicherverlusten, obwohl das Kompilieren selten ist und für meinen aktuellen Anwendungsfall akzeptabel ist. Ich könnte die Schlüssel wahrscheinlich regelmäßig durch gc.get_referrers laufen lassen und Tote töten, wenn ich müsste.
Da Sie die ursprüngliche Python Quelle haben, was ist der Sinn? –