【问题标题】:Why is EAFP considered pythonic?为什么EAFP被认为是pythonic?
【发布时间】:2017-10-21 04:04:55
【问题描述】:

考虑下面的例子,

myList = [1, 2, 3, 4, 5, 6]

要打印最后一个索引,

# Non - pythonic
if len(myList) >= 6:
   print(myList[5])
else:
   print('Index does not exist')

# Pythonic
try:
   print(myList[5])
except:
   print('Index does not exist')

请求宽恕而不是获得许可背后的想法是什么?

【问题讨论】:

  • 一般来说,有很多方法可以让 LBYL 方法(在你跳跃之前查看)错误,并且该技术甚至会导致竞争条件。 stackoverflow.com/questions/9748678/…
  • 您还需要考虑到某些情况下您无法知道您正在尝试的成功的先决条件(并且该先决条件甚至可能在测试和尝试之间变得无效)。因此,使用异常被认为更符合 Python 风格(但不是单纯的异常),因此有机会处理它的东西可以看到并可能处理它。

标签: python


【解决方案1】:

我不能说某些东西是否是 Pythonic,但我可以说为什么它会导致更简洁的代码。一般来说,您会做很多事情,而不仅仅是查看一个索引。所以考虑一下当我查看字典中的几个属性时会发生什么:

try:
    obj.a = data['a']
    obj.b = data['b']
    obj.c = data['c']
except KeyError: 
    #Oops our data didn't have all we needed.

在不使用异常处理的情况下,这些分配中的每一个都需要是一个 if 语句。也就是说,您可以在 try 块中执行的操作越多,需要处理错误的整个代码的百分比就越少。

【讨论】:

  • 扩大异常有什么好处?
  • @overexchange 更正答案。当您可以跨许多任务共享相同的错误处理程序时,异常扩大并不是说您的代码更有效率。
  • 请注意,只要你在实际改变状态之前失败(否则你必须做你的簿记才能恢复)并且如果你确定你的异常陷阱仅来自您正在考虑的案例。
  • @MatteoItalia 在这种特定情况下,您可以使用obj.a, obj.b, obj.c = itemgetter(*'abc')(data),因为它可以让 KeyError 很好地处理自己,但仍然可以根据分配传播异常,但在更复杂的情况下......是的...你需要做其他事情...
  • 哦,是的,但是谈论 try 块的范围对于这个问题来说太宽泛了,并且很适合编写教程领域。
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多