2011-06-08 8 views
11

"Variable"クラスでこのエラーを理解しようとしています。TypeError:このパターンオブジェクトをdeepcopyできません

「変数」クラスにsRE.SRE_Patternを格納したいと考えていました。 Variableクラスのコピーを開始し、すべてのVariableクラスインスタンスが変更されていることに気付きました。私は今このクラスをディープコピーする必要があることを理解していますが、今は "TypeError:このパターンオブジェクトをディープコピーできません"と出てきます。確かに、私はパターンをテキスト文字列として保存できますが、残りのコードはすでにコンパイルされたパターンを期待しています! Variableクラスをパターンオブジェクトでコピーする最も良い方法は何でしょうか?

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

を、それをdeepcopyする必要はありません。しかし、私は 'deepcopy()'に特定の型を扱う方法を教えているのを覚えていません(ただし、必要に応じて型に属性を追加することができます)。 –

+0

コードから例外をスローする行はありますか?私はそれをコピーしてコンパイルしました - >それは私の側でエラーなしで動作します。私が見つけた唯一の事は、Pythonのメソッド 'type'を書き直す変数を使用しようとすることです。これはあまり良いスタイルではありません。 –

+0

最後の行はPython 2.6で私のためにエラーをスローします。 –

答えて

7

deepcopyあなたのクラスについては何も知らず、それらのコピー方法もわかりません。

あなたは__deepcopy__()方法実装することで、あなたのオブジェクトをコピーする方法deepcopyを伝えることができます:コンパイラの正規表現は不変であることを考えると

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

問題は 'VariableWithRE'をコピーすることです、あなたの例は本当に役立つわけではありませんが、正しい方向に進みます。 –

+0

私は両方のクラスでこのメソッドを試しました。最初に "TypeError:__deepcopy __()は正確に1つの引数(2が指定されています)"を取ると、次に[this](http://stackoverflow.com/questions/3036648/)を見ました。どのようにして-i-override-deep-copy-in-python)質問をし、 "def __deepcopy __(self、memo):"を試みました。構文はまだPythonを学んでいる人として私には変わっているようですが、大丈夫です。これは、VariableWithoutクラスでは動作しますが、VariableWithREクラスではまだ問題です!新しいエラー: "ValueError:コンパイルされたパターンでflags引数を処理できません" –

+2

@ user789215問題は、すでにコンパイルされた正規表現(self.regexTarget)を使って '' VariableWithoutRE''コンストラクタ(__init__)を呼び出していて、文字列。 – ThomasH

関連する問題