получить все функции, вызываемые в функции или исходном коде - PullRequest
1 голос
/ 06 февраля 2020

Первоначально я думал, что мне придется разобрать исходный код функции, чтобы получить все функции, которые она вызывает, но даже если бы я это сделал, у меня были бы только имена функций, а не сами функции.

Затем я нашел несколько вопросов, похожих на мой, например: Найти все вызовы функций по функции

Однако все остальные ответы предоставляют решения, которые возвращают список имена функций, они не возвращают сами функции. Я хотел бы получить список функций, вызываемых в функции, или исходный код в виде списка реальных функций это возможно? я должен использовать решение 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()>]

Возможно ли такое даже?

...