2

我正在寻找一种从访问者节点获取代码的方法。例子:

import libcst

code_example = """
from ast import parse
threshold  =  1
print(threshold)
"""

class CodeVisitor(libcst.CSTVisitor):
    def visit_Assign(self, node: libcst.Assign) -> bool:
        print(node)
        return True


demo = libcst.parse_module(code_example)
demo.visit(CodeVisitor())

在上面的代码中,我想获取节点的代码(即阈值 = 1)。但似乎 libcs​​t 不提供这种支持。我进一步环顾四周,发现了一个属于 Module的函数名code_for_node(node: libcst._nodes.base.CSTNode) → str libcs​​t.Module.code_for_node。但是我找不到足够的帮助来在我的代码中使用它。

期待帮助。提前致谢!

4

1 回答 1

3

花了一段时间后,我想出了解决问题的方法。这是代码。

代码:

import libcst as cst

code_example = """
from ast import parse
threshold  =  1
print(threshold)
"""

class CodeVisitor(cst.CSTVisitor):
    def visit_Assign(self, node: cst.Assign) -> bool:
        print("--> NODE TREE: \n{}".format(node))
        print("--> CODE LINE FROM NODE TREE: \n{}".format(cst.parse_module("").code_for_node(node)))
        return True


demo = cst.parse_module(code_example)
_ = demo.visit(CodeVisitor())

输出:

--> NODE TREE: 
Assign(
    targets=[
        AssignTarget(
            target=Name(
                value='threshold',
                lpar=[],
                rpar=[],
            ),
            whitespace_before_equal=SimpleWhitespace(
                value='  ',
            ),
            whitespace_after_equal=SimpleWhitespace(
                value='  ',
            ),
        ),
    ],
    value=Integer(
        value='1',
        lpar=[],
        rpar=[],
    ),
    semicolon=MaybeSentinel.DEFAULT,
)
--> CODE LINE FROM NODE TREE: 
threshold  =  1
于 2020-07-07T10:59:21.090 回答