2011-06-08 87 views
11

試圖在我的「變量」類中理解此錯誤。TypeError:無法深度複製此模式對象

我希望存儲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()'如何處理一個特定的類型(但是請注意,如果需要,你可以*向屬性中添加屬性)。 – 2011-06-08 13:22:48

+0

從你的代碼拋出異常的哪行?我已經複製它並編譯,然後 - >它在我身邊沒有任何錯誤。我唯一發現的是,你嘗試使用重寫python方法'type'的變量,這不是很好的風格。 – 2011-06-08 13:24:15

+0

最後一行在Python 2.6中引發了我的錯誤。 – 2011-06-10 07:19:04

回答

7

deepcopy對您的課程一無所知,不知道如何複製它們。

你可以告訴deepcopy如何通過實施__deepcopy__()方法您複製對象:

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

問題是複製'VariableWithRE',所以你的例子並沒有真正的幫助,但是它朝着正確的方向前進。 – 2011-06-08 15:43:14

+0

這個方法我試過在我的兩個類,第一我「類型錯誤:__deepcopy __()恰恰1個參數(2給出)」,然後我看着[此](http://stackoverflow.com/questions/3036648/如何在i-override-deepcopy-in-python)問題,並嘗試「def __deepcopy __(self,memo):」。語法對我來說似乎很陌生,因爲有人仍然在學習Python,但確定,備忘錄,很好。這可以在類VariableWithoutRE中工作,但類VariableWithRE仍然存在問題!新的錯誤:「ValueError異常:無法處理與編譯圖案標誌參數」 – 2011-06-10 07:32:31

+2

@ user789215的問題是,要調用的''VariableWithoutRE''構造函數(__init__)與已編譯的正則表達式(self.regexTarget),而構造函數需要一個字符串。 – ThomasH 2011-07-06 12:10:55