为 Python 代码构建调用树
Building a call tree for a Python code
我得到了一个 Python 代码,以及它导入的模块。我想构建一棵树,指示哪个函数调用其他函数。我该怎么做?
你应该从程序的主要功能开始,在第一层 link 从主要调用的所有功能这将提供一个起点,然后你可以 link 所有它下面的函数。
您可以使用 python 标准库中的 ast
(抽象语法树)模块
# foo.py
def func(x):
print('hello')
正在使用 ast.parse
:
解析文件
import ast
tree = ast.parse(open('foo.py').read())
print(ast.dump(tree)) # dumps the whole tree
# get the function from the tree body (i.e. from the file's content)
func = tree.body[0]
# get the function argument names
arguments = [a.arg for a in func.args.args]
print('the functions is: %s(%s)' % (func.name, ', '.join(arguments)))
输出:
"Module(body=[FunctionDef(name='func', args=arguments(args=[arg(arg='x', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Str(s='hello')], keywords=[]))], decorator_list=[], returns=None)])"
the functions is: func(x)
我得到了一个 Python 代码,以及它导入的模块。我想构建一棵树,指示哪个函数调用其他函数。我该怎么做?
你应该从程序的主要功能开始,在第一层 link 从主要调用的所有功能这将提供一个起点,然后你可以 link 所有它下面的函数。
您可以使用 python 标准库中的 ast
(抽象语法树)模块
# foo.py
def func(x):
print('hello')
正在使用 ast.parse
:
import ast
tree = ast.parse(open('foo.py').read())
print(ast.dump(tree)) # dumps the whole tree
# get the function from the tree body (i.e. from the file's content)
func = tree.body[0]
# get the function argument names
arguments = [a.arg for a in func.args.args]
print('the functions is: %s(%s)' % (func.name, ', '.join(arguments)))
输出:
"Module(body=[FunctionDef(name='func', args=arguments(args=[arg(arg='x', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Str(s='hello')], keywords=[]))], decorator_list=[], returns=None)])"
the functions is: func(x)