代码之家  ›  专栏  ›  技术社区  ›  Muhammad Alkarouri

给定一个AST,是否有一个用于获取源代码的工作库?

  •  10
  • Muhammad Alkarouri  · 技术社区  · 16 年前

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

    Here ast 模块,特别是 NodeTransformer . 我正在寻找一种方法将生成的AST转换回源代码,以便可以直观地检查更改。

    3 回复  |  直到 16 年前
        1
  •  9
  •   wjandrea sebs    5 年前

    Python源代码树包含以下内容的实现: unparse.py 在Demo/parser目录中

    编者按 ast.unparse() 在Python 3.9中, unparse.py has been removed ,因此上述链接已更新为指向3.8。

        2
  •  4
  •   hoefling    7 年前

    astunparse 这是基于 unparse.py 内德的建议 his answer . 例子:

    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=[]))])
    
        3
  •  3
  •   snakecharmerb    6 年前

    从python3.9开始,ast模块提供 unparse 此函数:

    推荐文章