Python: 深拷贝AST节点树

12

我正在尝试使用copy模块中的deepcopy方法从ast模块深度复制一个节点树。

但是似乎这样并不起作用。当我使用复制后的结果时,我遇到了一些奇怪的错误,比如TypeError: required field "name" missing from FunctionDef(缺少“name”属性),我检查了一下,复制的节点确实缺少它,所以深度复制没有成功。

有什么方法可以让它正常工作吗?或者说我可能漏掉了什么东西吗?


像这样的问题,它是一个猜谜游戏。通常没有“诀窍”,请发布您相关的代码。 - Trufa
2
我认为这是一个很好的问题,他的问题非常清晰明了,加一。 - agf
3
@agf:我取消了我的负评,以防万一。由于我对这个主题缺乏技术知识,似乎我错了,也许这只是一个模糊的问题,如果是这样,我向Albert道歉。 - Trufa
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报告中提出了此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接