2011-07-21 12 views
8

Estoy tratando de usar deepcopy (desde el módulo copy) para copiar profundamente un árbol de nodos desde el módulo ast.Python: copie profundamente el árbol de nodos

Esto no parece funcionar. Recibo errores extraños como TypeError: required field "name" missing from FunctionDef cuando uso el resultado copiado (y lo comprobé, realmente falta en el nodo copiado), por lo que no los copió correctamente.

¿Hay algún truco que pueda hacer que esto funcione? O tal vez me estoy perdiendo algo?

+0

Con la pregunta como esta, es un juego de adivinanzas. En general, no hay "trucos", publique su código correspondiente. – Trufa

+1

Creo que esta es una buena pregunta, y perfectamente claro cuál es su problema, +1. – agf

+1

@agf: eliminé mi voto negativo por las dudas. Parece que estaba equivocado debido a mi falta de conocimiento técnico sobre el tema, tal vez solo parece una pregunta vaga, si ese es el caso, mis disculpas a Albert. – Trufa

Respuesta

8

Lo siento, estaba equivocado. copy.deepcopy parece funcionar correctamente. La razón por la que pensé que no funcionaría es a causa de este comportamiento muy extraño:

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 

Esto devuelve None en PyPy. Probablemente un error porque en CPython 2.6, obtengo foo. Curiosamente, en PyPy, si elimino name=None de la llamada ast.FunctionDef, también obtengo foo como salida.

Creé bug report for PyPy sobre esto.

Cuestiones relacionadas