使用dis模块把Python代码反编译为字节码

Python标准库dis — Disassembler for Python bytecode,作用是把python代码反汇编为字节码指令


Python 代码是先被编译为字节码后,再由Python虚拟机来执行字节码,Python的字节码是一种类似汇编指令的中间语言, 一个Python语句会对应若干字节码指令,虚拟机一条一条执行字节码指令,从而完成程序执行。
Python dis 模块支持对Python代码进行反汇编,生成字节码指令。

dis可以在命令行中执行:

python -m dis xxx.py

也可以import dis包使用:

示例1:

>>> import dis
>>> dis.dis('s[a] += b')
1 0 LOAD_NAME 0 (s)
3 LOAD_NAME 1 (a)
6 DUP_TOP_TWO
7 BINARY_SUBSCR
8 LOAD_NAME 2 (b)
11 INPLACE_ADD
12 ROT_THREE
13 STORE_SUBSCR
14 LOAD_CONST 0 (None)
17 RETURN_VALUE

示例2:

>>> from dis import dis
>>> dis('{1}')
1 0 LOAD_CONST 0 (1)
3 BUILD_SET 1
6 RETURN_VALUE
>>> dis('set([1])')
1 0 LOAD_NAME 0 (set)
3 LOAD_CONST 0 (1)
6 BUILD_LIST 1
9 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
12 RETURN_VALUE

有时需要分析代码的执行过程,dis是一个很好的分析工具。Python是用C来实现的,所以对于Python的性能或代码质量的评估可以通过dis模块获取到对应的字节码指令来进行评估。