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