2011-06-08 12 views
11

मेरी "परिवर्तनीय" कक्षा में इस त्रुटि को समझने का प्रयास कर रहा है।टाइप एरर: इस पैटर्न ऑब्जेक्ट को गहराई से नहीं कर सकता

मैं अपने "परिवर्तनीय" वर्ग में एक sre.SRE_Pattern स्टोर करने की उम्मीद कर रहा था। मैंने वैरिएबल क्लास की प्रतिलिपि बनाना शुरू कर दिया और देखा कि यह मेरे सभी परिवर्तनीय वर्ग के उदाहरणों को बदलने का कारण बन रहा था। अब मैं समझता हूं कि मुझे इस वर्ग को गहराई से करने की ज़रूरत है, लेकिन अब मैं "टाइप एरर: इस पैटर्न ऑब्जेक्ट को गहराई से नहीं चला सकता" में भाग लेता हूं। निश्चित रूप से, मैं पैटर्न को एक स्ट्रिंग स्ट्रिंग के रूप में स्टोर कर सकता हूं लेकिन मेरा बाकी कोड पहले से संकलित पैटर्न की अपेक्षा करता है! एक पैटर्न ऑब्जेक्ट के साथ मेरी वैरिएबल क्लास की प्रतिलिपि बनाने का सबसे अच्छा तरीका क्या होगा?

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

यह देखते हुए कि संकलक regexp अपरिवर्तनीय है, यह आवश्यक नहीं है यह deepcopy है। हालांकि मुझे याद नहीं है कि कैसे एक विशेष प्रकार को संभालने के लिए 'deepcopy()' को बताएं (लेकिन ध्यान दें कि यदि आप आवश्यक हो तो निर्माण में विशेषताओं को जोड़ सकते हैं)। –

+0

आपके कोड फेंकने अपवाद से कौन सी रेखा? मैंने इसे कॉपी किया है और फिर संकलित किया है -> यह मेरी तरफ से किसी भी त्रुटि के बिना काम करता है। मुझे मिली एकमात्र चीज यह है कि आप वेरिएबल का उपयोग करने का प्रयास करते हैं जो पाइथन विधि 'टाइप' को फिर से लिखते हैं और यह बहुत अच्छी शैली नहीं है। –

+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

मैंने अपनी दोनों कक्षाओं में इस विधि की कोशिश की, पहले मुझे "टाइप एरर: __deepcopy __() बिल्कुल 1 तर्क (2 दिया गया) लेता है", फिर मैंने देखा [यह] (http://stackoverflow.com/questions/3036648/ कैसे-कैसे-मैं-ओवरराइड-गहरी कॉपी-इन-पायथन) प्रश्न, और "def __deepcopy __ (स्वयं, ज्ञापन)" की कोशिश की: "। सिंटैक्स मेरे लिए अजीब लगता है क्योंकि कोई अभी भी पाइथन सीख रहा है, लेकिन ठीक है, ज्ञापन, ठीक है। यह कक्षा चरणीय WithoutRE में काम करता है लेकिन कक्षा वैरिएबल WithRE के साथ अभी भी समस्या! नई त्रुटि: "ValueError: संकलित पैटर्न के साथ झंडे तर्क को संसाधित नहीं कर सकता है" –

+2

@ user789215 समस्या यह है कि आप पहले से संकलित रेगेक्स (self.regexTarget) के साथ 'VariableWithoutRE'' कन्स्ट्रक्टर (__init__) का आह्वान कर रहे हैं, जबकि कन्स्ट्रक्टर अपेक्षा करता है एक स्ट्रिंग। – ThomasH

संबंधित मुद्दे