Muh*_*uri 11 python abstract-syntax-tree
有没有办法将给定的Python抽象语法树(AST)转换为源代码?
这是一个如何使用Python ast模块的一个很好的例子,特别是一个NodeTransformer.我正在寻找一种方法将生成的AST转换回源,因此可以直观地检查更改.
Python源代码树包含了这样一个实现:unparse.py在演示/分析器目录: https://github.com/python/cpython/blob/master/Tools/parser/unparse.py
从 Python 3.9 开始,ast 模块为此提供了一个unparse函数:
解解析一个 ast.AST 对象并生成一个带有代码的字符串,如果使用 ast.parse() 解析回来,该代码将生成等效的 ast.AST 对象
我发现了一个不错的第三方库:astunparse它基于unparse.pyNed 在他的回答中的建议。例子:
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)))
Run Code Online (Sandbox Code Playgroud)
运行会产生
class C():
def f(self, arg):
return f'{arg}'
print(C().f(('foo' + 'bar')))
Run Code Online (Sandbox Code Playgroud)
另一个简洁的函数是astunparse.dump漂亮地打印代码对象:
astunparse.dump(ast.parse(code))
Run Code Online (Sandbox Code Playgroud)
输出:
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=[]))])
Run Code Online (Sandbox Code Playgroud)