我有一个python片段如下
5 + 6 * 8
将其编译为 AST 给出:
>>> ast.dump(compile('5+6*8', '', 'eval', ast.PyCF_ONLY_AST))
Expression(body=BinOp(left=Num(n=5), op=Add(), right=BinOp(left=Num(n=6), op=Mult(), right=Num(n=8))))
请注意,在生成的 AST6 * 8
中没有优化为 48。
但是,如果我编译这个生成的 AST 并反汇编,6 * 8
则替换为48
.
>>> astree = compile('5+6*8', '', 'eval', ast.PyCF_ONLY_AST)
>>> dis.disco(compile(astree, '', 'eval'))
1 0 LOAD_CONST 0 (5)
3 LOAD_CONST 3 (48)
6 BINARY_ADD
7 RETURN_VALUE
我的问题
如何在没有常量折叠优化的情况下将代码编译为字节码?我需要这样做来开发一个混淆器。