2011-06-08 12 views
11

Tratando de entender este error en mi clase "Variable".TypeError: no se puede hacer una copia profunda de este objeto de patrón

Tenía la esperanza de almacenar un sre.SRE_Pattern en mi clase "Variable". Acabo de comenzar a copiar la clase Variable y noté que estaba causando que todas las instancias de la clase Variable cambiasen. Ahora entiendo que necesito hacer una copia profunda de esta clase, pero ahora me encuentro con "TypeError: no se puede hacer una copia profunda de este objeto de patrón". Claro, puedo almacenar el patrón como una cadena de texto, pero el resto de mi código ya espera un patrón compilado. ¿Cuál sería la mejor manera de copiar mi clase Variable con un objeto de patrón?

import re 
from copy import deepcopy 

class VariableWithRE(object): 
    "general variable class" 
    def __init__(self,name,regexTarget,type): 
     self.name = name 
     self.regexTarget = re.compile(regexTarget, re.U|re.M) 
     self.type = type 

class VariableWithoutRE(object): 
    "general variable class" 
    def __init__(self,name,regexTarget,type): 
     self.name = name 
     self.regexTarget = regexTarget 
     self.type = type 

if __name__ == "__main__": 

    myVariable = VariableWithoutRE("myName","myRegexSearch","myType") 
    myVariableCopy = deepcopy(myVariable) 

    myVariable = VariableWithRE("myName","myRegexSearch","myType") 
    myVariableCopy = deepcopy(myVariable) 
+0

Dado que la expresión regular compilador es inmutable, no es necesario que DeepCopy. Sin embargo, no recuerdo cómo se dice 'deepcopy()' cómo manejar un tipo particular (pero tenga en cuenta que * puede * agregar atributos al tipo de compilación si es necesario). –

+0

¿Qué línea de tu código arroja una excepción? Lo he copiado y compilado, entonces -> funciona sin ningún error a mi lado. Lo único que encontré es que intentas usar una variable que reescribe el método de python 'type' y este no es un estilo muy bueno. –

+0

La última línea me arroja el error en Python 2.6. –

Respuesta

7

deepcopy no sabe nada acerca de sus clases y no sabe cómo copiar ellos.

Se puede decir deepcopy cómo copiar sus objetos mediante la implementación de un método __deepcopy__():

class VariableWithoutRE(object): 
    # ... 
    def __deepcopy__(self): 
     return VariableWithoutRE(self.name, self.regexTarget, self.type) 
+0

El problema es copiar 'VariableWithRE', por lo que su ejemplo realmente no ayuda, pero va en la dirección correcta. –

+0

Intenté este método en mis dos clases, primero obtuve "TypeError: __deepcopy __() toma exactamente 1 argumento (2 dado)", luego miré [esto] (http://stackoverflow.com/questions/3036648/ pregunta, e intentó "def __deepcopy__ (self, memo):". La sintaxis me parece extraña ya que alguien todavía está aprendiendo Python, pero vale, nota, está bien. Esto funciona en la clase VariableWithout, pero sigue siendo un problema con la clase VariableWithRE! Nuevo error: "ValueError: no se puede procesar el argumento flags con un patrón compilado" –

+2

@ user789215 El problema es que está invocando al constructor '' VariableWithoutRE'' (__init__) con una expresión regular ya compilada (self.regexTarget), mientras el constructor espera una cuerda. – ThomasH

Cuestiones relacionadas