有异常的三元运算符?
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.
我经常发现自己编写如下代码:
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.