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