1
使用ast
和astor
圖書館,我寫了一個簡單的腳本,遍歷使用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
時保持節點不變?
輝煌 - 沒想到在這個文檔中查找。謝謝! –