6

Pythonの文字列(ファイルではなく、文字列、ファイルなし)があるとしましょう

TheString = "k=abs(x)+y"

わかった?次に、文字列をPythonバイトコードにコンパイルします

Binary = compile( TheString , "<string>" , "exec" )

問題:元の文字列オブジェクトを表す文字列であるTheStringがわからないと仮定して、Binaryからどのように取得できますか?

簡単に言うと、compile()の反対の関数は何ですか?

4

1 に答える 1

16

ソースコードがないと、コードを概算することしかできません。コンパイルされたバイトコードをモジュールで逆アセンブルしてから、近似値としてソースコードを再構築できます。dis

>>> import dis
>>> TheString = "k=abs(x)+y"
>>> Binary = compile( TheString , "<string>" , "exec" )
>>> dis.dis(Binary)
  1           0 LOAD_NAME                0 (abs)
              3 LOAD_NAME                1 (x)
              6 CALL_FUNCTION            1
              9 LOAD_NAME                2 (y)
             12 BINARY_ADD          
             13 STORE_NAME               3 (k)
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE        

abs()逆アセンブラから、1行あり、という名前の関数が。という名前の1つの引数で呼び出されていることがわかりますx。結果は別の名前に追加されy、結果はに保存されkます。

(他の多くの作業の上にuncompile6構築する)のようなプロジェクトはまさにそれを行います。Pythonバイトコードを逆コンパイルし、そこからPythonコードを再構築します。

于 2013-03-15T12:31:13.920 に答える