异常语法中'或'的解释,为什么它是有效的语法,它是如何工作的?

Ben*_*Ben 8 python exception

我的一位同事错误地输入了这个(简化的)代码,并想知道为什么他的例外没有被抓住:

>>> try:
...     raise ValueError
... except IndexError or ValueError:
...     print 'Caught!'
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError
Run Code Online (Sandbox Code Playgroud)

现在我知道捕获两种类型的异常的正确语法应该是except (IndexError, ValueError):,但为什么以上认为是有效的语法?它是如何工作的?

例如,上面的代码将抛出一个ValueError,它不会被捕获.但是拿这个代码:

>>> try:
...     raise IndexError
... except IndexError or ValueError:
...     print 'Caught!'
... 
Caught!
Run Code Online (Sandbox Code Playgroud)

IndexError将陷入.如何or评估,评估的内容是什么?!

感谢您可以放下任何光线!

Roh*_*ain 12

那是因为IndexError or ValueError被评估为IndexError.

>>> IndexError or ValueError
<type 'exceptions.IndexError'>
Run Code Online (Sandbox Code Playgroud)

or运算符返回计算结果为第一个表达式True(在这种情况下IndexError),或最后一个表达式,若没有一个是True.
所以,你的except语句实际上相当于:

except IndexError:
Run Code Online (Sandbox Code Playgroud)