有异常的三元运算符?

Ternary Operator with Exceptions?

我经常发现自己编写如下代码:

try:
    name = names[2]
except IndexError:
    name = names[1]

或者也许:

try:
    name = Names.first
except AttributeError:
    name = Names.default

由于三元运算符有一个很好的语法,我想知道异常是否有类似的语法?类似于:

name = names[2] except IndexError names[1]

name = Names.first except AttributeError Names.default

符合以下三元运算符样式:

name = names[2] if names[2] else names[1]

没有用于处理异常的表达式(尽管有一个 rejected PEP 试图引入一个)。但是,您可以首先避免异常。

name = names[2:0:-1][0]  # At the cost of making a small temporary list object

假设 names 至少有 2 个值,切片生成一个列表,其第一个元素是 names[2]names[1],具体取决于实际有多少元素 names已。使用 [0].

检索切片的第一个元素。

也没有等同于 dict.get 的东西可以让你写出类似 names.get(2, names[1]) 的东西,尽管这表明你的列表 应该 dict 或具有更多语义结构的东西。

该语法不存在,但您可以执行类似的操作:

要处理IndexError,检查索引是否在范围内:

name = names[2 if 2 in range(len(names)) else 1]

要处理 AttributeError,请使用 getattr 和默认值:

name = getattr(Names, 'first', Names.default)

编辑:正如@chepner 所建议的,第一个也可以简化为这些:

name = names[2 if len(names) > 2 else 1]

name = names[min(len(names), 2)] # if len(names > 0) and you just want the last element.