2024-10-01 09:17:40 发布
网友
我在玩dis库来收集关于函数的信息(比如它调用的其他函数)。^{}的文档听起来像是会返回其他函数调用,但我尝试了一些函数,它总是返回一个空列表。你知道吗
dis
dis.findlabels(code) Detect all offsets in the code object code which are jump targets, and return a list of these offsets.
这个函数应该做什么?你将如何使用它?你知道吗
例如,此函数有一个跳转:
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
9 POP_JUMP_IF_FALSE 16
因此,findlabels找到跳转目标:
findlabels
>>> dis.findlabels(f.__code__.co_code) [16]
跳转目标由反汇编输出中的>>注释。你知道吗
>>
例如,在:
def f(i): if i == 1: return 1 elif i == 2: return 2
dis.dis(f)显示:
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]。你知道吗
dis.findlabels(f.__code__.co_code)
[16, 32]
例如,此函数有一个跳转:
请看这里:
在
9 POP_JUMP_IF_FALSE 16
中有一个跳转到16因此,
findlabels
找到跳转目标:跳转目标由反汇编输出中的
>>
注释。你知道吗例如,在:
dis.dis(f)
显示:和
dis.findlabels(f.__code__.co_code)
返回[16, 32]
。你知道吗相关问题 更多 >
编程相关推荐