2011-07-21 5 views
8

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

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

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

+0

С таким вопросом, это игра с угадыванием. Как правило, нет «трюков», пожалуйста, разместите соответствующий код. – Trufa

+1

Я думаю, что это хороший вопрос, и совершенно ясно, в чем его проблема, +1. – agf

+1

@agf: Я удалил свой голос на всякий случай. Кажется, я ошибался из-за моего отсутствия технических знаний по этому вопросу, может быть, это похоже на неопределенный вопрос, если это так, мои извинения Альберту. – Trufa

ответ

8

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

Я создал bug report for PyPy об этом.