Python dis.findlabels()做什么?
我在玩Python dis.findlabels()做什么?,python,Python,我在玩dis库来收集关于函数的信息(比如它调用的其他函数)。的文档听起来像是它会返回其他函数调用,但我已经尝试了一些函数,它总是返回一个空列表 这个函数应该做什么?您将如何使用它?跳转目标由反汇编输出中的注释 例如,在: def f(i): if i == 1: return 1 elif i == 2: return 2 dis.dis(f)显示: 2 0 LOAD_FAST 0 (i)
dis
库来收集关于函数的信息(比如它调用的其他函数)。的文档听起来像是它会返回其他函数调用,但我已经尝试了一些函数,它总是返回一个空列表
这个函数应该做什么?您将如何使用它?跳转目标由反汇编输出中的
注释
例如,在:
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.\uuuu code\uuuu.co\u code)
返回[16,32]
跳转目标由反汇编输出中的>
注释
例如,在:
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.\uuuu code\uuuu.co\u code)
返回[16,32]
例如,此函数有一个跳转:
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中有一次跳转到16
因此,findlabels
查找跳转目标:
>>> dis.findlabels(f.__code__.co_code)
[16]
例如,此函数有一个跳转:
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中有一次跳转到16
因此,findlabels
查找跳转目标:
>>> dis.findlabels(f.__code__.co_code)
[16]
使用dis.findlabels(f.\uu-code\uu.co\u-code)
并确保f中有一个跳转目标(例如for循环中的条件中断语句)使用dis.findlabels(f.\uu-code\uu.co\u-code)
并确保f中有一个跳转目标(例如for循环中的条件中断语句)哈哈,这与我的示例几乎相同。英雄所见略同,对吧?;)你能解释一下反汇编中的数字指的是什么吗?@wim第一列:行号;第3列:字节码偏移量,第5列:字节码参数(可能是字节码偏移量)。这些被称为标签有什么原因吗?为什么不直接称它为find_jump_targets呢?@InAFlash它几乎肯定来自C,其中goto
(或者开关中的case
)的目标被称为标签。哈哈,这与我的示例几乎相同。英雄所见略同,对吧?;)你能解释一下反汇编中的数字指的是什么吗?@wim第一列:行号;第3列:字节码偏移量,第5列:字节码参数(可能是字节码偏移量)。这些被称为标签有什么原因吗?为什么不直接称它为find_jump_targets呢?@InAFlash它几乎肯定来自C,在C中,goto
(或者开关中的case
)的目标称为标签。