我正在玩dis
库以收集有关函数的信息(就像它调用的其他函数一样)。 dis.findlabels
的文档听起来会返回其他函数调用,但是我已经尝试了一些函数并且它总是返回一个空列表。
dis.findlabels(code) Detect all offsets in the code object code which are jump targets, and return a list of these offsets.
这个函数应该做什么,你将如何使用它?
答案 0 :(得分:2)
例如,此函数有一个跳转:
def f(x):
if x > 0: # This will jump to "return 2" if not x > 0
return 1
else:
return 2
在此处查看:
>>> dis.disco(f.__code__)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 4 (>)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_CONST 2 (1)
15 RETURN_VALUE
5 >> 16 LOAD_CONST 3 (2)
19 RETURN_VALUE
20 LOAD_CONST 0 (None)
23 RETURN_VALUE
9 POP_JUMP_IF_FALSE 16
因此,findlabels
找到跳转目标:
>>> dis.findlabels(f.__code__.co_code)
[16]
答案 1 :(得分:1)
跳转目标在反汇编输出中由>>
注释。
例如,在:
def f(i):
if i == 1:
return 1
elif i == 2:
return 2
dis.dis(f)
显示:
2 0 LOAD_FAST 0 (i)
3 LOAD_CONST 1 (1)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 16
3 12 LOAD_CONST 1 (1)
15 RETURN_VALUE
4 >> 16 LOAD_FAST 0 (i)
19 LOAD_CONST 2 (2)
22 COMPARE_OP 2 (==)
25 POP_JUMP_IF_FALSE 32
5 28 LOAD_CONST 2 (2)
31 RETURN_VALUE
>> 32 LOAD_CONST 0 (None)
35 RETURN_VALUE
而dis.findlabels(f.__code__.co_code)
会返回[16, 32]
。