2013-05-03 38 views
0

我正在嘗試在Python中使用ast類。我想獲得所有函數調用及其相應的參數。是否有ast python3文檔? (至少對於語法)

我該如何實現它?關於python.org的官方文檔非常含糊。

我也嘗試過實施visit_Namevisit_Call,但是這給了我更多的呼叫名稱。如果有某些文件屬於哪個節點擁有,那將會很好。例如,用於名稱節點的id和用於呼叫節點的func。

+1

的[摘要語法(http://docs.python.org/3/library/ast.html#抽象語法)是從Python源代碼自動生成的,並且它恐怕是一樣好。 – 2013-05-03 14:58:26

+0

請注意,函數不是唯一可調用的東西。類是可調用的,類型是可調用的,帶'__call__'方法的實例是可調用的。既然你不能反思被調用的項目的類型,你確實會看到的不僅僅是被調用的函數。 – 2013-05-03 15:00:05

+0

請注意,經過一段時間的觀察抽象語法之後,它開始變得更容易理解所有這些事情(以及各種ast節點類型的屬性)。 – mgilson 2013-05-03 15:13:17

回答

2

我知道沒有其他文檔,但可以通過研究示例(如Alex Martelli的this one)學到很多東西。你可以通過修改稍稍啓動,這種方式:

import ast 

class FuncVisit(ast.NodeVisitor): 
    def __init__(self): 
     self.calls = [] 
     self.names = [] 
    def generic_visit(self, node): 
     # Uncomment this to see the names of visited nodes 
     # print(type(node).__name__) 
     ast.NodeVisitor.generic_visit(self, node) 
    def visit_Name(self, node): 
     self.names.append(node.id) 
    def visit_Call(self, node): 
     self.names = [] 
     ast.NodeVisitor.generic_visit(self, node) 
     self.calls.append(self.names) 
     self.names = []   
    def visit_keyword(self, node): 
     self.names.append(node.arg) 

tree = ast.parse('''\ 
x = foo(a, b) 
x += 1 
bar(c=2)''') 
v = FuncVisit() 
v.visit(tree) 
print(v.calls) 

產生

[['foo', 'a', 'b'], ['bar', 'c']] 
+0

在Visit類上定義'generic_visit'的目的是什麼? – mgilson 2013-05-03 15:14:36

+0

另外,你爲什麼不訪問'加載'節點(或他們的任何孩子)? – mgilson 2013-05-03 15:15:54

+0

@mgilson:那些從其他代碼遺留的退化器官:)感謝您指出錯誤! ('generic_visit'對於調試可能非常有用,但是,我將這些代碼留在那裏用print語句來顯示如何使用它。) – unutbu 2013-05-03 18:12:08