Python Libcst: невозможно сгенерировать код из узла в классе посетителей

Я ищу способ получить код из узла в посетителе. Пример:

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) узла. Но похоже, что libcst не предоставляет такой поддержки. Далее я огляделся и выяснил имя функцииcode_for_node(node: libcst._nodes.base.CSTNode) → str libcst.Module.code_for_node, принадлежащий модулю. Но мне не удалось найти достаточно помощи, чтобы использовать это в моем коде.

Жду помощи. Заранее спасибо!

1 ответ

Решение

Потратив некоторое время, я нашел способ решить проблему. Вот код.

Код:

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
Другие вопросы по тегам