2013-01-07 19 views
5

ich wissen muss konvertieren weigert sich, warum dies nicht gelingt:Python Tupel und Listen. Ein Tupel, die

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 

Wenn ich den Code ausführen, erhalte ich folgende msg: <snip> ConfigurationError.py", line 7, in __init__ self.args[0]=self.__prettyfi(self.args[0]) TypeError: 'tuple' object does not support item assignment

ich die Zeile bearbeitet Nr. um dieses Codebeispiel zu vergleichen.

Ich verstehe nicht, warum self.args = list(args) nicht korrekt die Tupel in der Liste in Zeile auspacken 5.

(Ich habe den leisen Verdacht, ich etwas super-Grund erinnern bin Ausfallen ...)

Antwort

11

Exception.args ist ein descriptor; es hakt __set__, um alles zu drehen, das Sie self.args in einem Tupel zuweisen.

Sobald Sie also Ihre Liste self.args zuweisen, konvertiert der Deskriptor sie zurück in ein Tupel. Es ist nicht so, dass Ihr list() Anruf fehlgeschlagen ist, nur dass Exception.args ist speziell.

BaseException.args dokumentiert ist ein Tupel zu sein, und in Python 2, Objekte Ausnahme Unterstützung Slicing:

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

Ausnahmen sind auch als unveränderlich angenommen; Das .args Attribut ein Tupel zu behalten hilft, sie so zu behalten. Darüber hinaus erwartet der __str__ Handler für Exceptions .args ein Tupel zu sein, und das Setzen auf etwas anderes hat led to strange bugs in the past.

+2

Gibt es einen technischen Grund, warum es ein Deskriptor ist? –

+3

@Tinctorius: Ausnahmen sind unveränderlich, und 'args' muss auch sein. Darüber hinaus ist 'Exception.args' als Tupel dokumentiert. –

+0

grrrrrrrrrrrr ... danke. Raten Sie schlecht für die Schleife entpacken Sie es dann. Es sei denn, jemand kennt einen besseren Weg ....? – Jase