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. x86_64 ubuntu22.04环境下编译版本python3.13.0 alpha 0源码——python3.13.0 alpha 0的源码编译

    python3.13.0 alpha 0版本源码编译: 环境--x86_64 ubuntu22.04系统: 1. 源码下载: git clone https://github.com/python/c ...

  2. 国产深度学习框架MindSpore的高校发展之旅——“样本点”计划

    MindSpore这个框架我是使用时间比较早的了,因为这是华为的产品,而且正好是我所在的领域,再加上前些年华为的那些爱国宣传,我是大力支持这个软件的,而且是非常支持的那种.虽然之前就知道华为的这个软件 ...

  3. [POI2008] POC-Trains 题解

    前言 题目链接:洛谷. 时间复杂度和输入同阶的做法. 题意简述 有 \(n\)(\(n \leq 10^3\))个长 \(m\) 的字符串,\(q\)(\(q \leq 10^5\))次操作,交换两个 ...

  4. vue开发者工具dev-tool的安装

    1.下载网址:https://github.com/Redxym/dev-tools 2.谷歌浏览器->扩展程序,拖动刚刚下载好的压缩包,将chrome文件夹添加至'加载已解压的扩展程序' // ...

  5. c++高效位运算函数之 __builtin_

    https://www.cnblogs.com/tldr/p/11288935.html int __builtin_ffs (unsigned int x) 返回x的最后一位1的是从后向前第几位,比 ...

  6. OpenPCDet复现过程记录

    0.前言 OpenPCDet项目之前我就复现过,一个很优秀的项目,这几天又需要用到这个项目,再次复现遇到了不少问题,特此记录复现的流程 1.环境准备 1.1.前置条件 以下是我安装的版本 CUDA 1 ...

  7. element-plus 如何点击其它位置触发文件上传

    原文链接:https://www.xiandanplay.com/article/view?id=16925669181947904&articleCategoryId=16078840161 ...

  8. autorun.inf 配置

    autorun.inf 文件是一个配置文件,通常用于可移动磁盘(如 USB 驱动器和 CD/DVD)来自动执行某些操作或配置一些设置.当插入可移动磁盘时,Windows 会读取 autorun.inf ...

  9. Ubuntu 修改密码

    强制修改密码 可以通过切换到 root 帐户强制修改密码来绕过密码长度限制: sudo su # 切换到 root 帐户 passwd USER # 修改密码 或者: sudo passwd $(wh ...

  10. 2024 NepCTF

    NepCTF NepMagic -- CheckIn 直接玩游戏就能出 注意有一关要把隐藏的方块全找到 NepCamera 先使用tshark读取数据 结果文件中发现大量jpeg头ffd8ffe0. ...