有没有一种方法可以将给定的 Python 抽象语法树 (AST) 转换为源代码呢?
这里有一个很好的例子,展示了如何使用 Python 的 ast
模块,特别是 NodeTransformer
。我正在寻找一种将结果 AST 转换回源代码的方法,以便可以通过视觉手段来检查更改。
有没有一种方法可以将给定的 Python 抽象语法树 (AST) 转换为源代码呢?
这里有一个很好的例子,展示了如何使用 Python 的 ast
模块,特别是 NodeTransformer
。我正在寻找一种将结果 AST 转换回源代码的方法,以便可以通过视觉手段来检查更改。
Python源代码库中包含了这个实现:unparse.py,位于Demo/parser目录下。
编辑说明: 随着在Python 3.9中引入ast.unparse()
,unparse.py已被删除,因此上述链接已更新至3.8版本。
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=[]))])
ast
模块一起使用——它只能与由compiler.ast
模块生成的AST一起使用。 - David Given
for ... else
这样的东西有问题,但是到目前为止2.7还好。 - Muhammad Alkarouri