是什么显示findlabels()你做什么?

2024-10-01 09:17:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在玩dis库来收集关于函数的信息(比如它调用的其他函数)。^{}的文档听起来像是会返回其他函数调用,但我尝试了一些函数,它总是返回一个空列表。你知道吗

dis.findlabels(code)

Detect all offsets in the code object code which
are jump targets, and return a list of these offsets.

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


Tags: the函数in文档信息which列表object
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]

跳转目标由反汇编输出中的>>注释。你知道吗

例如,在:

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]。你知道吗

相关问题 更多 >