我需要将修改过的python对象转储回源代码中。所以我试图找到一些东西来把真正的python对象转换成pythonast.节点(稍后在^{
我想要的用法示例,Python 2:
import ast
import importlib
import astor
m = importlib.import_module('something')
# modify an object
m.VAR.append(123)
ast_nodes = some_magic(m)
source = astor.dump(ast_nodes)
请帮我找到some_magic
没有办法做你想做的,因为AST不是这样工作的。 当解释器运行您的代码时,它将从源文件中生成一个AST,并解释AST以生成python对象。 这些对象一旦生成后会发生什么与AST无关。在
但是,可以首先获得生成对象的AST。 模块
inspect
允许您获取某些python对象的源代码:但是
getsource()
的名字很贴切。 如果我更改m
中某个变量(或任何其他对象)的值,它不会更改其源代码。在即使可以从对象中重新生成AST,也不会有一个解决方案
^{pr2}$some_magic()
可以返回。 假设我在某个模块中有一个变量x
,我在另一个模块中重新分配了它:现在,
m.x
的值是228
,但是没有办法知道是什么表达式导致了这个值(好吧,不读取__main__.py
的AST,但这很快就会失控)。只是字面意思吗?函数调用的结果?在如果您确实需要在修改模块的某个值之后获得一个新的AST,那么最好的解决方案是自己转换原始AST。 您可以找到标识符的值的来源,并用您想要的替换赋值的值。 例如,在我的小示例中,
x = 0
由以下AST表示:为了得到与我在
__main__.py
中重新分配匹配的AST,我必须将上面的Assign
节点的值更改如下:如果您想这样做,我建议您查看Python关于AST节点转换器(ast.NodeTransformer)的文档,以及这本优秀的手册,其中记录了在Python ASTGreen Tree Snakes - the missing Python AST docs中可以遇到的所有节点。在
相关问题 更多 >
编程相关推荐