Python:深度复制ast节点树

时间:2011-07-21 14:34:41

标签: python copy abstract-syntax-tree deep-copy

我正在尝试使用deepcopy(来自copy模块)从ast模块深度复制节点树。

这似乎不起作用。当我使用复制的结果时,我得到像TypeError: required field "name" missing from FunctionDef这样的奇怪错误(我检查了它;它在复制的节点中确实丢失了),所以它没有正确复制它们。

我能用这个技巧吗?或许我错过了什么?

1 个答案:

答案 0 :(得分:9)

抱歉,我错了。 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中,如果我从name=None调用中移除ast.FunctionDef,我也会得到foo作为输出。

我为此创建了一个bug report for PyPy