Python:深度复制AST节点树
我正在尝试使用 deepcopy
(来自 copy
模块)来深度复制一个来自 ast
模块的节点树。
但是这似乎不太奏效。当我使用复制的结果时,出现了一些奇怪的错误,比如 TypeError: required field "name" missing from FunctionDef
,这意味着复制的节点中确实缺少了“name”这个字段,所以它没有正确复制。
有没有什么技巧可以让我解决这个问题?或者我是不是漏掉了什么?
1 个回答
11
抱歉,我之前说错了。copy.deepcopy
似乎是正常工作的。我之所以觉得它不行,是因为出现了一个很奇怪的情况:
import ast, copy
n = ast.FunctionDef(
name=None,
args=ast.arguments(args=[], vararg=None, kwarg=None, defaults=[]),
body=[], decorator_list=[])
n.name = "foo"
ast.fix_missing_locations(n)
n = copy.deepcopy(n)
print n.name
在 PyPy 中,这个返回的是 None
。这可能是个 bug,因为在 CPython 2.6 中,我得到了 foo
。奇怪的是,在 PyPy 中,如果我把 ast.FunctionDef
调用中的 name=None
去掉,我也得到了 foo
作为输出。
我为这个问题在 PyPy 提交了一个 bug 报告。