【问题标题】:python tuples and lists. A tuple that refuses to convertpython 元组和列表。拒绝转换的元组
【发布时间】:2012-12-21 04:17:01
【问题描述】:

我需要知道为什么会失败:

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 行的列表中。

(我偷偷怀疑我记不起一些超级基本的东西......)

【问题讨论】:

    标签: python list python-2.7 tuples iterable-unpacking


    【解决方案1】:

    Exception.args 是一个descriptor;它挂钩__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 是一个元组,并且将其设置为其他值有 led to strange bugs in the past

    【讨论】:

    • 它是描述符有什么技术原因吗?
    • @Tinctorius:异常是不可变的,args 也必须如此。此外,Exception.args 被记录为一个元组。
    • grrrrrrrrrrrrr...谢谢。猜猜循环解压它。除非有人知道更好的方法......?
    • +1,但这仍然让我有点不对劲。我在任何地方都找不到它是 descriptor 的文档——尽管它是 tuple 的文档很容易找到。在我看来,标准库中有很多地方,用户定义的子类可以更改文档的类型。为什么这应该是特别的? -- 虽然,它可能在somewhere 中明确说明。 Jython 的行为方式相同。
    • @mgilson:是的,我同意这没有很清楚地记录;我还没有找到比Exceptions documentation 更好的东西。
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多