Первоначально я думал, что мне придется разобрать исходный код функции, чтобы получить все функции, которые она вызывает, но даже если бы я это сделал, у меня были бы только имена функций, а не сами функции.
Затем я нашел несколько вопросов, похожих на мой, например: Найти все вызовы функций по функции
Однако все остальные ответы предоставляют решения, которые возвращают список имена функций, они не возвращают сами функции. Я хотел бы получить список функций, вызываемых в функции, или исходный код в виде списка реальных функций это возможно? я должен использовать решение ast
, но каким-то образом преобразовать объект ast
FunctionDef в объект функции? или это можно сделать с помощью dis
? Вот что у меня есть на данный момент:
import dis
def list_func_calls(fn):
funcs = []
bytecode = dis.Bytecode(fn)
instrs = list(reversed([instr for instr in bytecode]))
for (ix, instr) in enumerate(instrs):
if instr.opname == "CALL_FUNCTION":
load_func_instr = instrs[ix + instr.arg + 1]
funcs.append(load_func_instr.argval)
return ["%d. %s" % (ix, funcname) for (ix, funcname) in enumerate(reversed(funcs), 1)]
def a():
print(b())
def b():
return 'hi'
list_func_calls(a)
Я могу представить, что получить вызываемую функцию из Байт-кода может быть сложно, но я не знаю, я с этим ухожу, но я хотел бы вернуться:
[<function print>, <function __main__.b()>]
Возможно ли такое даже?