2013-01-07 11 views
5

muszę wiedzieć, dlaczego to się nie powiedzie:Python krotek i list. Krotka że odmawia konwertować

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 

Kiedy uruchomić kod, pojawia się następujący msg: <snip> ConfigurationError.py", line 7, in __init__ self.args[0]=self.__prettyfi(self.args[0]) TypeError: 'tuple' object does not support item assignment

I edycji linii nr. aby dopasować ten przykład kodu.

Nie rozumiem dlaczego self.args = list(args) nie poprawnie rozpakować krotka do listy w wierszu 5.

(mam skradanie mam podejrzenie braku zapamiętać coś super-podstawowe ...)

Odpowiedz

11

Exception.args jest descriptor; przechwytuje __set__, aby zmienić dowolne przypisane do self.args na krotkę.

Tak więc, po przypisaniu listy do self.args, deskryptor zamienia ją z powrotem na krotkę. To nie jest tak, że twoje połączenie list() nie powiodło się, po prostu Exception.args jest wyjątkowe.

BaseException.args udokumentowano jako krotka, w Pythonie 2 wyjątkiem obiektów pomocy krojenia:

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

wyjątkami są również powinna być niezmienna; utrzymywanie atrybutu .args koryguje je. Co więcej, obsługa handlowa __str__ dla wyjątków oczekuje, że .args będzie krotką, a ustawienie jej na inną ma wartość led to strange bugs in the past.

+2

Czy istnieje jakiś techniczny powód, dla którego jest to deskryptor? –

+3

@ Tinctorius: Wyjątki są niezmienne, a także 'args'. Co więcej, 'Exception.args' jest udokumentowane jako krotka. –

+0

grrrrrrrrrrrr ... dziękuję. Zgadnij źle dla pętli rozpakuj go wtedy. Chyba, że ​​ktoś zna lepszy sposób ...? – Jase