给定 AST,是否有一个工作库可以获取源代码?

发布于 2024-09-24 17:16:33 字数 288 浏览 6 评论 0原文

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

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

Is there a way to convert a given Python abstract syntax tree (AST) to a source code?

Here is a good example of how to use Python's ast module, specifically a NodeTransformer. I was looking for a way to convert the resulting AST back to source, so the changes can be inspected visually.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

人│生佛魔见 2024-10-01 17:16:33

Python 源代码树包含此实现: unparse.py在Demo/parser目录

编者注:随着引入ast.unparse() 在 Python 3.9 中,unparse.py 已被删除,因此上面的链接已更新为指向 3.8。

The Python source tree contains an implementation of this: unparse.py in the Demo/parser directory

Editor's note: With the introduction of ast.unparse() in Python 3.9, unparse.py has been removed, so the above link has been updated to point to 3.8.

葮薆情 2024-10-01 17:16:33

从 Python 3.9 开始,ast 模块提供了一个 unparse 函数这:

解解析一个 ast.AST 对象并生成一个字符串,其中包含的代码如果使用 ast.parse() 解析回来,将生成等效的 ast.AST 对象

As of Python 3.9, the ast module provides an unparse function for this:

Unparse an ast.AST object and generate a string with code that would produce an equivalent ast.AST object if parsed back with ast.parse()

日暮斜阳 2024-10-01 17:16:33

我发现了一个不错的第三方库: astunparse ,它基于关于 Ned 在他的回答中建议的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=[]))])

A nice third-party library I found: astunparse which is based on the unparse.py suggested by Ned in his answer. Example:

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)))

running which yields

class C():

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

Another neat function is astunparse.dump which pretty-prints the code object:

astunparse.dump(ast.parse(code))

Output:

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=[]))])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文