2016-04-14 48 views
1

使用astastor圖書館,我寫了一個簡單的腳本,遍歷使用ast.NodeTransformer的AST和替換所有空列表與None如何中止AST訪問者並保持原始節點不變?

import ast 
import astor 


class ListChanger(ast.NodeTransformer): 
    def visit_List(self, node): 
     if len(node.elts) > 0: 
      return ast.copy_location(node, node) 
     return ast.copy_location(ast.NameConstant(value=None), node) 

x = ast.parse("""["A"]""") 
ListChanger().visit(x) 
print(astor.to_source(x)) 

y = ast.parse("""[]""") 
ListChanger().visit(y) 
print(astor.to_source(y)) 

這正常工作,輸出:

["A"] 
None 

但是,如果列表爲空,我不確定是否使用了該函數:

return ast.copy_location(node, none) 

如果我將其替換爲return,如果不滿足條件,使腳本返回None,則節點將被銷燬而不會保持不變,因此ast.List節點已被銷燬,因此第一個測試用例打印出空白字符串。

我不希望發生這種情況,但我也認爲使用ast.copy_location(node, node)似乎是錯誤的。是否有專門的功能使節點保持不變並退出該功能,或者配置ast.NodeTransformer以便在visit函數返回None時保持節點不變?

回答

1

documentation

返回值可以是在這種情況下沒有替換髮生在原始節點。

所以不是:

return ast.copy_location(node, none) 

剛:

return node 
+0

輝煌 - 沒想到在這個文檔中查找。謝謝! –

相關問題