2013-01-07 29 views
5

Tôi cần phải biết tại sao điều này không:tuples và danh sách python. Một tuple mà từ chối để chuyển đổi

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 

Khi tôi chạy mã này, tôi nhận được msg sau: <snip> ConfigurationError.py", line 7, in __init__ self.args[0]=self.__prettyfi(self.args[0]) TypeError: 'tuple' object does not support item assignment

Tôi chỉnh sửa các dòng không có. để phù hợp với mẫu mã này.

Tôi không hiểu tại sao self.args = list(args) không giải nén một cách chính xác các tuple vào danh sách ở dòng 5.

(Tôi có một nghi ngờ lén Tôi không nhớ một cái gì đó siêu cơ bản ...)

Trả lời

11

Exception.argsdescriptor; nó móc __set__ để biến mọi thứ bạn gán cho self.args thành một bộ.

Vì vậy, ngay sau khi bạn gán danh sách của mình cho self.args, trình mô tả sẽ chuyển đổi nó trở lại thành bộ tuple. Nó không phải là cuộc gọi list() của bạn không thành công, nó chỉ là Exception.args là đặc biệt.

BaseException.args được ghi chép lại là một tuple, và bằng Python 2, ngoại trừ các đối tượng hỗ trợ cắt:

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

Exceptions cũng có nghĩa vụ phải không thay đổi; giữ thuộc tính .args một tuple giúp giữ chúng như vậy. Hơn nữa, trình xử lý __str__ cho trường hợp ngoại lệ mong đợi .args là một bộ dữ liệu và đặt nó thành một thứ khác có led to strange bugs in the past.

+2

Có bất kỳ lý do kỹ thuật nào tại sao nó là một bộ mô tả không? –

+3

@Tinctorius: Ngoại lệ là không thay đổi và 'args' cũng phải là quá. Hơn nữa, 'Exception.args' được ghi nhận là một tuple. –

+0

grrrrrrrrrrrr ... cảm ơn bạn. Đoán bệnh cho vòng lặp giải nén nó sau đó. Trừ khi ai đó biết một cách tốt hơn ....? – Jase

Các vấn đề liên quan