Python: глубоко скопировать дерево узлов - PullRequest
9 голосов
/ 21 июля 2011

Я пытаюсь использовать deepcopy (из модуля copy) для глубокого копирования дерева узлов из модуля ast.

Это не похоже на работу.Я получаю странные ошибки, такие как TypeError: required field "name" missing from FunctionDef, когда я использую скопированный результат (и я проверил его; он действительно отсутствует в скопированном узле), поэтому он не правильно скопировал их.

Есть лиуловка, я могу заставить это работать?Или, может, я что-то упустил?

1 Ответ

9 голосов
/ 21 июля 2011

Извините, я ошибся.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

Возвращает None в PyPy.Вероятно, ошибка, потому что в CPython 2.6 я получаю foo.Странно, но в PyPy, если я удаляю name=None из вызова ast.FunctionDef, я также получаю foo в качестве вывода.

Я создал отчет об ошибке для PyPy по этому поводу.

...