Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从组成元素生成ast,而不使用python中的ast.parse_Python_Abstract Syntax Tree - Fatal编程技术网

从组成元素生成ast,而不使用python中的ast.parse

从组成元素生成ast,而不使用python中的ast.parse,python,abstract-syntax-tree,Python,Abstract Syntax Tree,使用pythonast模块,可以生成一个简单的抽象语法树,如下所示: import ast module = ast.parse('x=3') import astor astor.to_source(module) import astor, ast module = ast.parse('x=3') ast.dump(module) 这将生成一个模块对象,可使用astor库检索该对象的源代码,如下所示: import ast module = ast.parse('x=3') imp

使用python
ast
模块,可以生成一个简单的抽象语法树,如下所示:

import ast
module = ast.parse('x=3')
import astor
astor.to_source(module)
import astor, ast
module = ast.parse('x=3')
ast.dump(module)
这将生成一个
模块
对象,可使用
astor
库检索该对象的源代码,如下所示:

import ast
module = ast.parse('x=3')
import astor
astor.to_source(module)
import astor, ast
module = ast.parse('x=3')
ast.dump(module)
生成

'x = 3\n'

在不使用
ast.parse
方法的情况下,是否可以从其组成元素构成完全相同的模块对象,以便
astor.to\u source
方法可以生成相同的源代码?如果是,怎么办?

我想我刚刚找到了。使用
ast.dump
可以检查树的内容,如下所示:

import ast
module = ast.parse('x=3')
import astor
astor.to_source(module)
import astor, ast
module = ast.parse('x=3')
ast.dump(module)
这将产生以下输出,揭示底层结构:

"Module(body=[Assign(targets=[Name(id='x', ctx=Store())], value=Num(n=3))])"
我们可以利用这些信息从头开始构建同一棵树,然后使用
astor
恢复源代码:

module = ast.Module(body=[ast.Assign(targets=[ast.Name(id='x', ctx=ast.Store())], value=ast.Num(n=3))])
astor.to_source(module)
其输出如下:

'x = 3\n'
但是,有一个问题,因为执行此新树会导致错误:

exec(compile(module, filename='<ast>', mode="exec"))
exec(编译(模块,文件名=“”,mode=“exec”))
回溯(最近一次调用):文件“”,第1行,在 TypeError:stmt中缺少必填字段“lineno”

要解决此问题,必须使用
ast.fix\u missing\u locations
方法将行号添加到每个节点