在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。
答案 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。