EAFP 与 LBYL 是两种“防御性处理机制”,相信你一定接触过,只是可能没有深入思考过这个问题。

输入两个数,要输出相除后的结果:

a, b = map(int, input().split())
print(a / b)

但是b可以等于0,我们有两种检查方式:

# EAFP
try:
print(a / b)
except ZeroDivisionError: print('Error') # LBYL
if b != 0:
print(a / b)
else: print('Error')

第一种风格叫做EAFP(Easier to Ask for Forgiveness than Permission),也就是“获得原谅比请求许可容易”,也就是不做检查,直接try,有问题再处理异常。

第二种风格叫做LBYL(Look Before You Leap),也就是“三思而后行",先排除错误,再执行代码。


除了除0检查外,再比如检查文件存在,检查字典是否存在键等....这种操作非常常见。实际上两种形式常常共存。

从效率上讲,try语句需要执行保留现场,堆栈解退等操作,肯定比if慢,但是LBYL每次都要做固定成本检查;理论上果发生异常并不多,则EAFP更优,反之LBYL更优。

编程语言内置结构往往倾向抛出异常(比如python访问空键的KeyError或者c++使用new失败时默认也是抛出异常),然后让用户自己解决。


在自己写代码时,python鼓励多使用EAFP和异常,这是由他的动态类型所决定的,你编写的函数可能适用于各种类型,你不知道它是什么,只要它有反馈就可以了,没有反馈再处理。同时python的异常系统很完善,包含了各种常见的错误,也很容易继承扩展自定义异常,有利于可读性。

而如果是c++,类型一般是严格的,大部分时候可以知道各个对象的细节,相对合理的做法是用LBYL直接处理“意料之中”的异常(比如你明知道除数是有0的,或者你知道要访问字典,而大部分时候是查询空键),而用try处理在调试时候发生在意料之外的异常。同时《Effective C++》里就提到过,在C++里不应该滥用try,因为在c++这样效率敏感的场合,try的检查和回溯非常慢,与if效率差距很大。

EAFP 与 LBYL 风格的更多相关文章

  1. EAFP vs LBYL

    EAFP vs LBYL 检查数据可以让程序更健壮,用术语来说就是防御性编程.检查数据的时候,有EAFP和LBYL两种不同的编程风格,具体的意思如下: LBYL: Look Before You Le ...

  2. EAFP和LBYL 两种防御性编程风格

    EAFP:Easier to ask for forgiveness than permission 获得事后原理总是比事先得到许可要容易的多. 这个EAFP在python中表现的比较多.EAFP,T ...

  3. 软件工程 - 防御式编程EAFP vs LBYL

    概念 EAFP:easier to ask forgiveness than permission LBYL:look before you leap 代码 # LBYL def getUserInf ...

  4. 翻译《Writing Idiomatic Python》(二):函数、异常

    原书参考:http://www.jeffknupp.com/blog/2012/10/04/writing-idiomatic-python/ 上一篇:翻译<Writing Idiomatic ...

  5. 如何像Python高手(Pythonista)一样编程

    最近在网上看到一篇介绍Pythonic编程的文章:Code Like a Pythonista: Idiomatic Python,其实作者在2006的PyCon会议后就写了这篇文章,写这篇文章的主要 ...

  6. [转]如何像Python高手(Pythonista)一样编程

    本文转自:http://xianglong.me/article/how-to-code-like-a-pythonista-idiomatic-python 最近在网上看到一篇介绍Pythonic编 ...

  7. [译] 如何像 Python 高手一样编程?

    转自:http://www.liuhaihua.cn/archives/23475.html Harries 发布于 7天前 分类:编程技术 阅读(15) 评论(0) 最近在网上看到一篇介绍Pytho ...

  8. 如果连这10个Python缩写都不知道,那你一定是Python新手

    简介 对于许多开始学习编程的人来说,Python已经成为他们的首选.Python有非常直观的语法和支持动态类型的灵活性.此外,它是一种解释语言,这使得使用交互式控制台进行学习成为可能.基本上,我们只需 ...

  9. 深度分析:Java中如何如理异常,一篇帮你搞定!

    异常的背景 初识异常 我们曾经的代码中已经接触了一些 "异常" 了. 例如: 除以 0 System.out.println(10 / 0); // 执行结果 Exception ...

  10. Python术语对照表

    >>> 交互式终端中默认的 Python 提示符.往往会显示于能以交互方式在解释器里执行的样例代码之前. ... 可以是指:交互式终端中输入特殊代码行时默认的 Python 提示符, ...

随机推荐

  1. Ax = b 的迭代解法 —— 共轭梯度 (算法步骤)

    线性方程组 Ax =b 除了高斯消元法以外,还有其它的迭代解法,这里我们说的是共轭梯度法. 这里只针对 A 满足 对称 (  ), 正定(即  ),并且是实系数的,那么我们可以用 梯度下降 和 共轭梯 ...

  2. DebugView使用

    操作说明 要知道怎么操作debugview,首先得下载下来.https://docs.microsoft.com/en-us/sysinternals/downloads/debugview 配置过滤 ...

  3. 【运维技巧】海豚调度工作流实例卡在正在停止&任务实例卡在正在运行怎么办?

    在大数据调度系统中,,大家可能会碰到任务实例状态更新不及时的情况. 对于Apache DolphinScheduler用户来说,这可能意味着前端显示的任务状态与实际情况不一致,即使任务已经在后台停止运 ...

  4. 通过内存映射的方式向lcd屏幕输出几个圆

    /************************************************* * * file name:color.c * author :momolyl@126.com * ...

  5. THUPC2024 初赛

    <南开大学数分I月考III在初赛开始四十分钟时结束> 早晨试图速成泰勒展开失败了 考试前 zsy 把 yzf 接到学校了,应该是国赛后第一次见 yzf 考完试发现 yzf 已经买好 KFC ...

  6. Java 读取命令行输入

    在 Java 中,您可以使用 Scanner 类从命令行读取输入.这个类属于 java.util 包,因此在使用之前您需要导入该包. 下面是一个如何从命令行读取输入的 Java 程序示例: impor ...

  7. SpringBoot启动异常:Reason: Failed to determine a suitable driver class

    程式之前都运行正常,忽然一天运行报错: *************************** APPLICATION FAILED TO START ************************ ...

  8. 【YashanDB知识库】调整NUMBER精度,再执行统计信息收集高级包偶现数据库异常退出

    [问题分类]功能使用 [关键字]NUMBER类型精度修改,统计信息收集 [问题描述]存量的表将NUMBER类型的字段精度从小精度调整为大精度时,数据库收集这张业务表的统计信息时,会导致数据库异常退出. ...

  9. Java 集合工具包

    Java 集合工具包 Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等. Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分 ...

  10. 所见即所得,赋能RAG:PDF解析里的段落识别

    前几天,有一位用户使用OCR产品识别多栏论文后向我们询问:要怎么解决不合适的断句.分段以及错误阅读顺序的问题? 我们用一个相似案例为大家直观展示这位用户遇到的情况. 如图中的多栏期刊,如果用OCR识别 ...