作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在几个地方(here 和 here)有人说 Python 强调“请求宽恕比请求许可更容易”(EAFP)应该用异常只应该真正调用的想法来缓和异常(exception)情况。考虑以下情况,我们在优先级队列中弹出并推送直到只剩下一个元素:
import heapq
...
pq = a_list[:]
heapq.heapify(pq)
while True:
min1 = heapq.heappop(pq)
try:
min2 = heapq.heappop(pq)
except IndexError:
break
else
heapq.heappush(pq, min1 + min2)
# do something with min1
异常仅在循环的 len(a_list)
迭代中引发一次,但它并不是真正的异常,因为我们知道它最终会发生。这种设置使我们免于多次检查 a_list
是否为空,但(也许)它的可读性不如使用显式条件。
对这种非异常程序逻辑使用异常的共识是什么?
最佳答案
exceptions should only be called in truly exceptional cases
不是在 Python 中:例如,每个 for
循环(除非它过早地break
或return
) 因抛出并捕获异常 (StopIteration
) 而终止。因此,每个循环发生一次的异常对 Python 来说并不陌生——它经常出现!
所讨论的原则在其他语言中可能很重要,但绝对没有理由将该原则应用于 Python,因为它与语言的精神背道而驰。
在这种情况下,我喜欢 Jon 的重写(应该通过删除 else 分支来进一步简化),因为它使代码更紧凑——一个实用的原因,绝对不是 Python 风格与异类原则的“调和”。
关于Python 异常 : EAFP and What is Really Exceptional?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3086806/
我是一名优秀的程序员,十分优秀!