鉴于AST,是否有一个工作库来获取源代码?

时间:2010-09-22 22:41:44

标签: python abstract-syntax-tree

有没有办法将给定的Python抽象语法树(AST)转换为源代码?

Here是如何使用Python ast模块的一个很好的例子,特别是NodeTransformer。我正在寻找一种方法将生成的AST转换回源,因此可以直观地检查更改。

4 个答案:

答案 0 :(得分:8)

Python源代码树包含以下内容的实现:Demo / parser目录中的unparse.py:https://github.com/python/cpython/blob/master/Tools/parser/unparse.py

答案 1 :(得分:2)

从Python 3.9开始,ast模块为此提供了unparse函数:

未解析ast.AST对象,并生成一个包含代码的字符串,如果使用ast.parse()进行解析,该代码将产生等效的ast.AST对象

答案 2 :(得分:1)

答案 3 :(得分:1)

我发现了一个不错的第三方库:astunparse,它基于Ned在his answer中建议的unparse.py。示例:

import ast
import astunparse

code = '''
class C:
    def f(self, arg):
        return f'{arg}'

print(C().f("foo" + 'bar'))
'''

print(astunparse.unparse(ast.parse(code)))

运行会产生

class C():

    def f(self, arg):
        return f'{arg}'
print(C().f(('foo' + 'bar')))

另一个简洁的函数是astunparse.dump,它漂亮地打印了代码对象:

astunparse.dump(ast.parse(code))

输出:

Module(body=[
  ClassDef(
    name='C',
    bases=[],
    keywords=[],
    body=[FunctionDef(
      name='f',
      args=arguments(
        args=[
          arg(
            arg='self',
            annotation=None),
          arg(
            arg='arg',
            annotation=None)],
        vararg=None,
        kwonlyargs=[],
        kw_defaults=[],
        kwarg=None,
        defaults=[]),
      body=[Return(value=JoinedStr(values=[FormattedValue(
        value=Name(
          id='arg',
          ctx=Load()),
        conversion=-1,
        format_spec=None)]))],
      decorator_list=[],
      returns=None)],
    decorator_list=[]),
  Expr(value=Call(
    func=Name(
      id='print',
      ctx=Load()),
    args=[Call(
      func=Attribute(
        value=Call(
          func=Name(
            id='C',
            ctx=Load()),
          args=[],
          keywords=[]),
        attr='f',
        ctx=Load()),
      args=[BinOp(
        left=Str(s='foo'),
        op=Add(),
        right=Str(s='bar'))],
      keywords=[])],
    keywords=[]))])