Python:深度复制AST节点树

12 投票
1 回答
3706 浏览
提问于 2025-04-16 22:00

我正在尝试使用 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 报告。

撰写回答