5

这发生在 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 中定义的事实可能与它有关吗?https://github.com/python/cpython/blob/master/Objects/exceptions.c

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

4

1 回答 1

4

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

如果然后查看 BaseException_set_args,它会将参数强制转换为元组。如果您尝试将 self.args 设置为无法转换为元组的内容(例如 try Error(23)),您将收到 TypeError。

于 2012-08-14T02:45:29.153 回答