You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Libcst是否提供将CST语法树转换为Python源码的解码函数?

问题描述

我通过libcst.parse_module得到了如下CST语法树输出:

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官方parser文档仅找到将Python源码转为CST树的教程,恳请技术帮助。

解决方法

LibCST提供了直接将语法树转回源码的方式,核心是利用节点的code属性或code_for_node方法:

  • 方法一:直接访问Module对象的code属性
    如果你已经持有Module类型的语法树实例,直接读取它的code属性就能得到完整的Python源码:

    import libcst
    
    # 假设你的语法树实例是cst_tree
    source_code = cst_tree.code
    # 对于示例中的树,会输出:hi = 0
    
  • 方法二:使用libcst.Module.code_for_node()方法
    这个方法适用于任意CST节点(不仅是整个Module),传入节点对象即可生成对应源码:

    import libcst
    
    # 传入整个Module节点
    source_code = libcst.Module.code_for_node(cst_tree)
    # 也可以传入单个节点,比如示例中的Assign节点
    assign_node = cst_tree.body[0].body[0]
    assign_source = libcst.Module.code_for_node(assign_node)
    # assign_source会输出:hi = 0
    

这两种方式都会保留语法树中记录的所有格式细节(比如赋值符号前后的空格、换行等),精准还原出符合原格式的Python代码。

内容的提问来源于stack exchange,提问作者shanzhuer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:01:41