2016-09-16 76 views
0

我正在玩dis库来收集有关函数的信息(就像它调用的其他函数一样)。 dis.findlabels的文档听起来像它会返回其他函数调用,但我已经尝试了一些函数,它总是返回一个空列表。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

使用'dis.findlabels(f .__ code __。co_code)'并确保f中有一个跳转目标(例如, for循环中的条件break语句) – wim

回答

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 

有一个跳跃到16 9 POP_JUMP_IF_FALSE 16

因此,findlabels认定,跳转目标:

>>> dis.findlabels(f.__code__.co_code) 
[16] 
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]

+0

哈哈,这与我的示例几乎相同。伟大的思想家都认为,对吧? ;) – zvone

+0

你能解释反汇编中的数字是指什么吗? – wim

+0

@wim第一列:行号;第3列:字节码偏移量,第5列:字节码参数(可能是字节码偏移量)。 – ecatmur