异常子类的args属性的类型从字符串更改为元组

时间:2012-08-14 02:30:14

标签: python

在python2.6和python3:

上都会发生这种情况
class Error(Exception):
    def __init__(self, args):
            print(type(args))
            print(type(self.args)) # From BaseException
            self.args = args
            print(type(self.args))

Error("foo")

这导致:

<type 'str'>
<type 'tuple'>
<type 'tuple'>
Error('f', 'o', 'o')

由于某种原因,args属性被强制转换为元组。 可能它在C中定义的事实与它有关吗? http://svn.python.org/view/python/trunk/Objects/exceptions.c?view=markup

args参数的名称无关。将其更改为“a”会导致相同的行为,只要将其分配给self.args。

1 个答案:

答案 0 :(得分:3)

查看链接到的代码,有一个为“args”属性定义的setter。查找BaseException_set_args - 它被设置(链接代码中的其他位置)作为args的setter。因此,当您编写self.args = args时,您实际上正在调用函数BaseException_set_args,并将args作为参数。

如果然后查看BaseException_set_args,它会将参数强制转换为元组。如果你尝试将self.args设置为无法转换为元组的东西(例如try Error(23)),你将得到一个TypeError。