2017-08-27 103 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調用的所有函數將提供一個起點,然後可以鏈接它下面的所有函數。