2013-01-07 8 views
5

मुझे पता है क्यों यह विफल रहता है की जरूरत है:पायथन टुपल्स और सूचियां। एक टपल मना कर दिया कि कन्वर्ट करने के लिए

class ConfigurationError(Exception): 
    def __init__(self, *args): 
     super(ConfigurationError, self).__init__(self, args) 

     self.args = list(args) 
     # Do some formatting on the message string stored in self.args[0] 
     self.args[0]=self.__prettyfi(self.args[0]) 

    def __prettyfi(self, arg): 
     pass 
     # Actual function splits message at word 
     # boundaries at pos rfind(arg[1:78]) if len(arg) >78 
     # it does this by converting a whitespace char to a \n 

जब मैं कोड चलाने के लिए, मैं निम्नलिखित संदेश प्राप्त करते हैं: <snip> ConfigurationError.py", line 7, in __init__ self.args[0]=self.__prettyfi(self.args[0]) TypeError: 'tuple' object does not support item assignment

मैं लाइन नहीं संपादित। इस कोड नमूना से मेल खाते हैं।

मुझे समझ नहीं आता क्यों self.args = list(args) सही ढंग से लाइन पर सूची में टपल खोल नहीं करता 5.

(मैं एक चुपके संदेह मैं कुछ सुपर बुनियादी याद करने में नाकाम रहने रहा हूँ ...)

उत्तर

11

Exception.args एक descriptor है; कुछ को self.args को टुपल में निर्दिष्ट करने के लिए __set__ को हुक करता है।

तो, जैसे ही आप अपनी सूची self.args पर असाइन करते हैं, वर्णनकर्ता इसे वापस एक टुपल में परिवर्तित कर देता है। ऐसा नहीं है कि आपका list() कॉल विफल हुआ, यह केवल Exception.args विशेष है।

BaseException.args एक टपल होने के लिए दर्ज है, और अजगर 2 में, अपवाद वस्तुओं समर्थन टुकड़ा करने की क्रिया:

>>> ex = Exception(1, 2) 
>>> ex.args 
(1, 2) 
>>> ex[0] 
1 

अपवाद भी अडिग होने की अपेक्षा की जाती है; .args विशेषता रखने के लिए एक ट्यूपल उन्हें रखने में मदद करता है। इसके अलावा, __str__ अपवादों के लिए हैंडलर .args को टुपल होने की अपेक्षा करता है, और इसे किसी अन्य चीज़ पर सेट करने के लिए led to strange bugs in the past है।

+2

क्या कोई तकनीकी कारण है कि यह एक वर्णक है? –

+3

@ टिनक्टरियस: अपवाद अपरिवर्तनीय हैं, और 'तर्क' भी होना चाहिए। इसके अलावा, 'Exception.args' को एक टुपल के रूप में प्रलेखित किया गया है। –

+0

grrrrrrrrrrrr ... धन्यवाद। लूप के लिए बीमार लगता है तो इसे अनपैक करें। जब तक कि कोई बेहतर तरीका नहीं जानता ....? – Jase

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