2011-06-08 13 views
11

Cercando di comprendere questo errore nella mia classe "Variable".TypeError: impossibile eseguire il deepcopy dell'oggetto pattern

Speravo di memorizzare un sre.SRE_Pattern nella mia classe "Variable". Ho appena iniziato a copiare la classe Variable e ho notato che stava causando la modifica di tutte le istanze della classe Variable. Ora capisco che ho bisogno di approfondire questa classe, ma ora mi imbatto in "TypeError: can not deepcopy this pattern object". Certo, posso memorizzare il pattern come una stringa di testo, ma il resto del mio codice si aspetta già un pattern compilato! Quale sarebbe il modo migliore per copiare la mia classe Variable con un oggetto modello?

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

Dato che il compilatore regexp è immutabile, non è necessario deepcopy esso. Comunque non ricordo come dire 'deepcopy()' come gestire un particolare tipo (ma nota, che * puoi * aggiungere attributi al tipo di build se necessario). –

+0

Quale riga del codice lancia l'eccezione? L'ho copiato e poi compilato -> funziona senza errori al mio fianco. L'unica cosa che ho trovato è che provi a usare variabili che riscrivono il metodo 'type' di python e questo non è uno stile molto buono. –

+0

L'ultima riga genera l'errore per me in Python 2.6. –

risposta

7

deepcopy non sa nulla circa le vostre classi e non sa come copiare loro.

Si può dire deepcopy come copiare gli oggetti mediante l'attuazione di un metodo __deepcopy__():

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

Il problema è copiare 'VariableWithRE', quindi il tuo esempio non è di grande aiuto, ma va nella giusta direzione. –

+0

Ho provato questo metodo in entrambe le mie classi, prima ho ricevuto "TypeError: __deepcopy __() richiede esattamente 1 argomento (2 dato)", quindi ho guardato [this] (http://stackoverflow.com/questions/3036648/ how-can-i-override-deepcopy-in-python) e ho provato "def __deepcopy __ (self, memo):". La sintassi mi sembra strana come qualcuno che sta ancora imparando Python, ma ok, memo, bene. Funziona nella classe VariableWithoutRE ma ha ancora problemi con la classe VariableWithRE! Nuovo errore: "ValueError: impossibile elaborare l'argomento flags con un pattern compilato" –

+2

@ user789215 Il problema è che si sta invocando il costruttore '' VariableWithoutRE'' (__init__) con un'espressione regolare già compilata (self.regexTarget), mentre il costruttore si aspetta una stringa. – ThomasH

Problemi correlati