我正在尝试使用copy
模块中的deepcopy
方法从ast
模块深度复制一个节点树。
但是似乎这样并不起作用。当我使用复制后的结果时,我遇到了一些奇怪的错误,比如TypeError: required field "name" missing from FunctionDef
(缺少“name”属性),我检查了一下,复制的节点确实缺少它,所以深度复制没有成功。
有什么方法可以让它正常工作吗?或者说我可能漏掉了什么东西吗?
我正在尝试使用copy
模块中的deepcopy
方法从ast
模块深度复制一个节点树。
但是似乎这样并不起作用。当我使用复制后的结果时,我遇到了一些奇怪的错误,比如TypeError: required field "name" missing from FunctionDef
(缺少“name”属性),我检查了一下,复制的节点确实缺少它,所以深度复制没有成功。
有什么方法可以让它正常工作吗?或者说我可能漏掉了什么东西吗?
抱歉,我错了。 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报告中提出了此问题。