Python:深度复制ast节点树

Alb*_*ert 9 python copy deep-copy abstract-syntax-tree

我正在尝试使用deepcopy(从copy模块)深度复制模块中的节点树ast.

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

有什么技巧可以使这个工作吗?或许我错过了什么?

Alb*_*ert 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
Run Code Online (Sandbox Code Playgroud)

这将None在PyPy中返回.可能是一个bug,因为在CPython 2.6中,我得到了foo.奇怪的是,在PyPy中,如果我name=Noneast.FunctionDef调用中删除,我也得到foo输出.

为PyPy创建了一个关于此的错误报告.