Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为Python代码构建调用树_Python_Function_Call Graph - Fatal编程技术网

为Python代码构建调用树

为Python代码构建调用树,python,function,call-graph,Python,Function,Call Graph,我得到了一个Python代码,以及它导入的模块。我想建立一个树,指出哪个函数调用其他函数。我该怎么做呢?您应该从程序的主函数开始,在第一层链接从主函数调用的所有函数,这将提供一个起点,然后您可以链接它下面的所有函数。您可以使用python标准库中的(抽象语法树)模块 # foo.py def func(x): print('hello') 使用ast.parse分析文件: import ast tree = ast.parse(open('foo.py').read()) print(

我得到了一个Python代码,以及它导入的模块。我想建立一个树,指出哪个函数调用其他函数。我该怎么做呢?

您应该从程序的主函数开始,在第一层链接从主函数调用的所有函数,这将提供一个起点,然后您可以链接它下面的所有函数。

您可以使用python标准库中的(抽象语法树)模块

# 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)

为什么投票结果如此接近?几个月前,我为
r
语言问了一个类似的问题,这个问题被认为适合这个网站:呃,实际上是接近票数:)我想我不得不继续问下去,让选民认为你的问题太宽泛了(不是吗?)。您还说过您正在“寻找一个能够自动完成此任务的模块或工具”,这意味着您的问题也是堆栈溢出。@vaultah您在这两个方面都错了。关于Stack Overflow,有人提出了与此极为相似的问题,得到了许多答案,有些问题的投票率也很高:因此,实际上,结束我的问题最有意义的原因是它是重复的:-),这不会让我错。像您这样的问题不符合当前的堆栈溢出准则,但几年前它们可能是可以接受的。此外,在评估问题是否与主题相关时,答案数量和问题分数也无关紧要。如果你有兴趣的话,问问Meta,看起来很有趣!不过,我不知道如何使用它。如果明天我添加一个简单的示例来修改我的问题,您能告诉我如何使用
ast
构建相应的调用树吗?嗯,输出看起来太冗长了,没有任何帮助。它似乎还包括每个函数中的所有语句,而不仅仅是调用。在数千行代码中,有许多依赖项,我认为它不会生成可用的输出。是否可以将输出限制为函数调用?明天我将添加一个最小的示例,其中包含输入和所需的输出。
ast.dump(tree)
只会很好地打印用于调试的树。您可以访问树成员和属性。我添加了获取函数名和参数的示例