私はPythonでcompile()と同等の機能を実現しようとしていますが、元の文字列を戻すこともできます。曖昧さ回避のために、これら2つの関数comp()とdecomp()を呼び出してみましょう。すなわち、Pythonでのコンパイル()の可逆バージョン
a = comp("2 * (3 + x)", "", "eval")
eval(a, dict(x=3)) # => 12
decomp(a) # => "2 * (3 + x)"
ある」(2 * X +が返される文字列は、( "2×(3 + X)" に許容されるであろう)同じである必要はないが、それは基本的に同じである必要があります6 "はそうではない)。コンパイルによって返されたコードオブジェクトの属性を設定する
- :
は、ここで私はがない作業を行うことを試みたものです。コードオブジェクトにカスタム属性を設定することはできません。
- コードをサブクラス化するので、属性を追加できます。コードをサブクラス化することはできません。
- コードオブジェクトを元の文字列にマッピングするWeakKeyDictionaryを設定します。コードオブジェクトを弱く参照することはできません。 ()をコンパイルするファイル名の元のコードの文字列を渡す
- :ここ
は問題に、仕事をするものです。しかし、実際にファイル名を保持する機能は失われてしまいます。これもやりたいことです。
- コードオブジェクトを文字列にマッピングする実際の辞書の保持。コンパイルはまれですが、現在のユースケースでは受け入れられますが、これはメモリをリークします。おそらく、gc.get_referrersを使ってキーを定期的に実行し、死んだものを殺すことができます。
あなたは、元のPythonのソースを持っているので、ポイントは何ですか? –