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 行目のリストにタプルを正しく展開しない理由がわかりません。

(超基本的なことを覚えていないのではないかとこっそり疑っています...)

4

1 に答える 1

11

Exception.args記述子です。フック__set__して、割り当てたものself.argsをタプルに変換します。

したがって、リストを に割り当てるとすぐにself.args、記述子はリストをタプルに変換します。あなたのlist()電話が失敗したのではなく、それException.argsが特別なのです。

BaseException.argsはタプルであると文書化されており、Python 2 では、例外オブジェクトはスライスをサポートしています。

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

例外も不変であると想定されています。属性をタプルにしておくと.args、それらを維持するのに役立ちます。さらに、__str__例外のハンドラーは.argsタプルであることを期待しており、それを別のものに設定すると、過去に奇妙なバグが発生しました

于 2013-01-07T12:25:30.803 に答える