【问题标题】:Ternary Operator with Exceptions?有异常的三元运算符?
【发布时间】:2020-05-10 21:45:00
【问题描述】:

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

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]

【问题讨论】:

  • 他们没有这样的语法...

标签: python exception conditional-operator


【解决方案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 或具有更多语义结构的东西。

【讨论】:

  • 是的,PEP 基本上正是我想要的。可耻,但我理解拒绝。谢谢。
【解决方案2】:

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

要处理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.

【讨论】:

  • 2 if len(names) > 2 else 1 会更简单一些。如果您可以假设len(names) > 0,您甚至可以选择min(len(names), 2)
  • @chepner 谢谢,我喜欢第一个建议,但后者有一些与之相关的假设(len(names) > 0),默认是最后一个元素)。我已根据您的建议编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 2021-08-01
  • 2017-05-10
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多