我在github (original)上找到了这个例子,但这似乎已经过时了,所以我稍微修改了一下。在
from uncompyle6.main import decompile
import sys
def uncompyle_test():
gen = (expr1 if cond1 else expr2 for A in [] if (expr3 if cond2 else expr4))
co = gen.gi_code
decompile (3.6, co, sys.stdout, showast=False)
uncompyle_test()
通过运行这个我得到
.0A if expr3 if cond2 else expr4
。
这似乎很不正确。是我漏掉了什么还是只是个虫子?在
这不是一个完整的答案,但它应该能让你知道发生了什么。在
首先要注意的是,传入
decompile()
函数的字节码版本应该与您正在运行的Python版本相同,因为这是正在生成的字节码类型。xdis具有确保:不过,我认为是这样。在
其次,当你反编译整个程序时,你会得到一个正确的结果:
^{pr2}$为什么你的努力没有奏效?主要的问题是uncompyle6需要知道它要删除什么类型的东西。回想一下,
compile()
函数有三个“模式”:“exec”、“eval”和“single”。在来自built-in function ^{} 的Python文档:
这里的上下文是s生成器,eval是一种表达式。deparse()不允许您选择您的意思,并使用“exec”。在较低级别的解析中,虽然您可以区分“exec”和“single”,但目前还没有一种方法来指定“eval”,更不用说在这个特定的函数中了。我已经打开了一个未编译的问题来注意这一点。在
最后,让我们再描述一下为什么你会看到你所看到的。在
为此,让我们使用我编写的这个方便而独特的调试器,它向您展示了在深度分解(deparing)和更重要的反汇编(disassembly)中发生了什么。在
因此您可以看到
.0
确实来自代码:它是一个临时变量,在生成器中使用。然而,应该有某种类型的“for”和“in[]”也不见了。我想,这是因为其他地方的代码设置了这个部分。在总而言之,事情有点怪,因为顶层的上下文是不对的。假设这是一个单独的表达式的语法规则应该被使用,而不是一个完整程序的语法规则。在
相关问题 更多 >
编程相关推荐