我正在尝试使用deepcopy
(来自copy
模块)从ast
模块深度复制节点树。
这似乎不起作用。当我使用复制的结果时,我得到像TypeError: required field "name" missing from FunctionDef
这样的奇怪错误(我检查了它;它在复制的节点中确实丢失了),所以它没有正确复制它们。
我能用这个技巧吗?或许我错过了什么?
答案 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。