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 回答