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
相关产品推荐
相关产品推荐

