2017-08-27 48 views
-2

我已经给出了Python代码以及它导入的模块。我想构建一个指示哪个函数调用其他函数的树。我怎样才能做到这一点?为Python代码构建调用树

+0

为什么近距离投票?几个月前,我问'r'语言的类似问题,它被认为适合这个网站:https://stackoverflow.com/questions/44198599/build-a-file-diagram-for-an-r-code – DeltaIV

+0

呃,实际上是接近的选票:)我想我必须要问这个Meta – DeltaIV

+0

接近选民认为你的问题太宽泛了(不是吗?)。你也说过你在寻找一个可以自动完成的模块或工具,这意味着你的问题也是[off-topic](http://stackoverflow.com/help/on-topic)堆栈溢出。 – vaultah

回答

1

可以使用ast(抽象语法树)模块从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) 
+0

看起来很有意思!不过,我不确定如何使用它。如果明天我修改我的问题并添加一个最简单的例子,你能告诉我如何使用'ast'来构建相应的调用树吗? – DeltaIV

+0

嗯,输出似乎太冗长,没有任何帮助。它似乎也包括每个函数中的所有语句,而不仅仅是调用。在长达数千行的代码中,有很多依赖关系,我不认为它会生成可用的输出。是否有可能限制输出到函数调用?明天我会添加一个最小的例子,输入和期望的输出。 – DeltaIV

+1

'ast.dump(tree)'只能很好地打印用于调试的树。您可以访问树成员和属性。我添加了获取函数名称和参数的示例 – ShmulikA

1

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