我最近被一些意想不到的东西咬了.我想做出类似的东西:
try : thing.merge(iterable) # this is an iterable so I add it to the list except TypeError : thing.append(iterable) # this is not iterable, so I add it
好吧,它工作正常,直到我传递了一个继承自Exception的对象,该对象应该被添加.
不幸的是,异常是可迭代的.以下代码不会引发任何TypeError
:
for x in Exception() : print 1
有人知道为什么吗?
请注意,正在发生的事情与任何类型的隐式字符串转换等无关,但是因为Exception类实现了__getitem __(),并使用它来返回args元组中的值(ex.args).您可以通过以下事实看到这一点:您将整个字符串作为迭代中的第一个也是唯一的项目,而不是迭代字符串时您将获得的逐个字符结果.
这也让我感到惊讶,但考虑到这一点,我猜它是出于向后兼容的原因.曾经使用的Python(1.5之前版本)缺少当前的异常类层次结构.相反,抛出字符串,(通常)一个元组参数,用于应该传递给处理块的任何细节.即:
try: raise "something failed", (42, "some other details") except "something failed", args: errCode, msg = args print "something failed. error code %d: %s" % (errCode, msg)
看起来这个行为是为了避免破坏1.5之前的代码,期望一个参数元组,而不是一个不可迭代的异常对象.在上面的链接的致命破坏部分中有几个这样的例子与IOError
字符串异常已经被推迟了一段时间,并且在Python 3中消失了.我现在已经检查了Python 3如何处理异常对象,看起来它们在那里不再可迭代:
>>> list(Exception("test")) Traceback (most recent call last): File "", line 1, in TypeError: 'Exception' object is not iterable
[编辑]检查python3的行为