Есть ли в libcst функция декодирования для преобразования дерева в исходный код python?
Я получил фрагмент вывода из примера программы libcst.parse_module, например:
Module(
body=[
SimpleStatementLine(
body=[
Assign(
targets=[
AssignTarget(
target=Name(
value='hi',
lpar=[],
rpar=[],
),
whitespace_before_equal=SimpleWhitespace(
value=' ',
),
whitespace_after_equal=SimpleWhitespace(
value=' ',
),
),
],
value=Integer(
value='0',
lpar=[],
rpar=[],
),
semicolon=MaybeSentinel.DEFAULT,
),
],
leading_lines=[],
trailing_whitespace=TrailingWhitespace(
whitespace=SimpleWhitespace(
value='',
),
comment=None,
newline=Newline(
value=None,
),
),
),
],
header=[],
footer=[],
encoding='utf-8',
default_indent=' ',
default_newline='\n',
has_trailing_newline=False,
)
Я много ищу, но до сих пор не знаю, как декодировать это дерево cst обратно в исходный код python. Кто-нибудь может помочь?
Я прочитал этот документ libcst , но там был только учебник по кодированию исходного кода python в дерево cst с использованием parse_module. Не могу найти способ декодировать дерево cst обратно в исходный код python.
1 ответ
Это то чтоModule.code
делает. Ваш пример, повторенный:
In [1]: from libcst import *
In [2]: m = Module(
...: body=[
...: Assign(
...
...: has_trailing_newline=False,
...: )
In [3]: m.code
Out[3]: 'hi = 0'
Для произвольных узлов используйте методModule.code_for_node()
. Пример:
In [4]: n = SimpleString(value='"spam"')
In [5]: m.code_for_node(n)
Out[5]: '"spam"'
Если у вас нетModule
экземпляр доступен, создайте его самостоятельно, используяlibcst.parse_module()
. Пример:
In [6]: n = Integer(value='42')
In [7]: parse_module('').code_for_node(n)
Out[7]: '42'