【发布时间】:2011-03-06 10:25:18
【问题描述】:
在几个地方(here 和 here)已经说过 Python 对“请求宽恕比请求许可更容易”(EAFP)的强调应该与只应真正调用异常的想法相缓和。例外情况。考虑以下情况,我们在优先级队列上弹出并推送,直到只剩下一个元素:
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 是否为空,但(也许)它比使用显式条件更易读。
对于这种非异常程序逻辑使用异常的共识是什么?
【问题讨论】:
-
您的代码对我来说看起来很奇怪。
heapify将列表就地转换为堆。由于pq = heapq.heapify(a_list),pq将是None。 -
你是对的!当我试图将我的实际代码提炼成适合示例的东西时,我犯了一个愚蠢的错误。现在已经修好了。