dis.findlabels()有什么作用?

时间:2016-09-16 21:10:57

标签: python

我正在玩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.

这个函数应该做什么,你将如何使用它?

2 个答案:

答案 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

中有一次跳转到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]