Python:深度复制ast节点树

发布于 2024-11-25 13:44:49 字数 274 浏览 2 评论 0原文

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

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

有什么技巧可以让它发挥作用吗?或者也许我错过了什么?

I'm trying to use deepcopy (from the copy module) to deeply copy a node tree from the ast module.

This doesn't seem to work. I'm getting strange errors like TypeError: required field "name" missing from FunctionDef when I use the copied result (and I checked it; it really is missing in the copied node), so it didn't correctly copied them.

Is there a trick I can make this working? Or maybe am I missing something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情深缘浅 2024-12-02 13:44:49

抱歉,我错了。 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 。可能是一个错误,因为在 CPython 2.6 中,我得到了 foo。奇怪的是,在 PyPy 中,如果我从 ast.FunctionDef 调用中删除 name=None,我也会得到 foo 作为输出。

我为此创建了一个 PyPy 错误报告

Sorry, I was wrong. copy.deepcopy seems to work correct. The reason I thought it wouldn't work is because of this very odd behavior:

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

This returns None in PyPy. Probably a bug because in CPython 2.6, I get foo. Strangely, in PyPy, if I remove name=None from the ast.FunctionDef call, I also get foo as the output.

I created a bug report for PyPy about this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文