python: 如何从代码对象获取源代码?
假设我们有一个Python字符串(不是文件,就是一个字符串,没有文件)
TheString = "k=abs(x)+y"
明白了吗?现在我们把这个字符串编译成一段Python字节码
Binary = compile( TheString , "<string>" , "exec" )
现在问题来了:如果我不知道这个字符串的内容,怎么从二进制数据中得到一个表示原始字符串对象的字符串呢?
简单来说:有什么函数是compile()的反向操作?
1 个回答
17
没有源代码的话,你只能大致猜测代码的样子。你可以用 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()
的函数,传入了一个参数 x
。这个函数的结果被加到另一个变量 y
上,最后结果存储在 k
里。
像 uncompile6
这样的项目(在很多人的基础上开发而成)就是用来做这个的;它可以把 Python 的字节码反编译,重新生成 Python 代码。