Python 异常 : EAFP and What is Really Exceptional?

标签 python exception

在几个地方(herehere)有人说 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 循环(除非它过早地breakreturn ) 因抛出并捕获异常 (StopIteration) 而终止。因此,每个循环发生一次的异常对 Python 来说并不陌生——它经常出现!

所讨论的原则在其他语言中可能很重要,但绝对没有理由将该原则应用于 Python,因为它与语言的精神背道而驰。

在这种情况下,我喜欢 Jon 的重写(应该通过删除 else 分支来进一步简化),因为它使代码更紧凑——一个实用的原因,绝对不是 Python 风格与异类原则的“调和”。

关于Python 异常 : EAFP and What is Really Exceptional?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3086806/

相关文章:

python - 是否有等同于 unittest unittest.TestLoader.loadTestsFromModule() 方法的 Pytest?

java - 困惑,像python,ruby这样的语言是单线程的吗?不像说java? (对于网络应用程序)

java - 如何在用户端从 Spring response.sendError(...) 检索描述性消息?

java - 使布局可点击,并启动一个 Intent

c++ - 扩展 std::exception 类:程序不会执行适当的 catch 处理程序

python - 在 pdfkit 中显示框而不是文本 - Python3

python - Pandas :通过聚合折叠每组中的前 n 行

java - Grails 中的 HeuristicCompletionException 是否可以简单地被忽略?

c# - 堆/缓冲区溢出异常

python - 子树之前有多少片叶子?