2011-07-21 9 views
8

Próbuję użyć deepcopy (z modułu copy), aby głęboko skopiować drzewo węzłów z modułu ast.Python: głęboko skopiować drzewo węzłów ast

To nie działa. Dostaję dziwne błędy, takie jak TypeError: required field "name" missing from FunctionDef, gdy używam skopiowanego wyniku (i go sprawdziłem, którego naprawdę brakuje w skopiowanym węźle), więc nie skopiowałem go prawidłowo.

Czy istnieje podstęp, który sprawi, że to zadziała? A może czegoś brakuje?

+0

Z takim pytaniem jest to gra zgadująca. Ogólnie nie ma "sztuczek", proszę zamieścić swój odpowiedni kod. – Trufa

+1

Myślę, że to jest dobre pytanie i doskonale wyjaśnić, jaki jest jego problem, +1. – agf

+1

@agf: Na wszelki wypadek usunąłem moje głosowanie. Wygląda na to, że się myliłem z powodu braku wiedzy technicznej na ten temat, może to wygląda na niejasne pytanie, jeśli tak jest, przepraszam Alberta. – Trufa

Odpowiedz

8

Przepraszam, myliłem się. copy.deepcopy wydaje się działać poprawnie. Powodem myślałem, że to nie będzie działać z powodu tej bardzo dziwne zachowanie:

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 

ta zwraca None w pypy. Prawdopodobnie błąd, ponieważ w CPython 2.6 dostaję foo. O dziwo, w PyPy, jeśli usunę name=None z wywołania, otrzymam również foo jako wynik.

Stworzyłem o tym bug report for PyPy.