2013-01-07 9 views
5

変換することを拒否したタプル: <snip> ConfigurationError.py", line 7, in __init__ self.args[0]=self.__prettyfi(self.args[0]) TypeError: 'tuple' object does not support item assignmentpythonタプルとリスト。私はこれが失敗した理由を知る必要があり

が、私はラインなし編集:私は、コードを実行すると

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 

が、私は以下のMSGを受けます。このコードサンプルと一致するようにします。

self.args = list(args)が正しく行でリストにタプルを解凍していない理由を私は理解していない5.

(I持って、私は超基本的な何かを覚えて失敗していますひそか疑い...)

答えて

11

Exception.argsdescriptorです。 __set__をフックしてのいずれかをに割り当て、self.argsをタプルに割り当てます。

リストを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

@Tinctorius:例外は不変で、 'args'もなければなりません。さらに、 'Exception.args'はタプルとして文書化されています。 –

+0

grrrrrrrrrrrr ...ありがとうございます。ループのためにそれを解凍してください。誰かがより良い方法を知っていない限り....? – Jase

関連する問題