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. springmvc配置文件中配置mybatis-plus日志输出

    1.背景 2.配置方式 如果application.properties文件格式: #sql日志logging.level.com.XX.XXX.mapper=debug如果是application. ...

  2. 白鲸开源 X SelectDB 金融大数据联合解决方案公布!从源头解决大数据开发挑战

    业务挑战与痛点 随着互联网技术的发展.云计算技术的成熟.人工智能技术的兴起和数字化经济的崛起,数据已成为企业的核心资产.在金融行业中,数字化已成为了支撑各类业务场景的核心力量,包括个人理财.企业融资. ...

  3. devtools工具遇到的坑

    下载devtools一定要下载5.1.1版本,其他版本要么就是下载依赖不行,要么就是打包不行,不清楚的同学会下载最新版,最新版的不能用,切记 地址放这里了: https://github.com/vu ...

  4. quartz集成spring集群部署

    由于quartz单节点无法满足业务的需求,后面我们在单节点的基础上进行了集群部署. 由以前的定时任务信息放在jobs.xml配置文件中,转而放到数据库中. 1.新建数据库表 CREATE TABLE ...

  5. IE、Chrome、Firefox修改http header信息

    在测试系统交互时,可能会碰到需要修改header信息的要求,下面介绍下如何在IE.Chrome.Firefox修改http header信息. 1.IE(fiddler) >在IE下修改head ...

  6. 3. 从0开始学ARM-ARM模式、寄存器、流水线

    关于ARM的一些基本概念,大家可以参考我之前的文章: <到底什么是Cortex.ARMv8.arm架构.ARM指令集.soc?一文帮你梳理基础概念[科普]> 关于ARM指令用到的IDE开发 ...

  7. 技术如何通过API接口获取自己想要同款商品的数据

    确定数据源: 首先,你需要确定哪些平台或服务提供商提供了你感兴趣的商品数据.例如,电商平台.品牌商.市场调研公司等. 了解API文档: 访问提供商的开发者门户网站,阅读API文档.文档会详细介绍如何使 ...

  8. jpa 查询 报错 EntityNotFoundException

    背景: 使用JPA查询,串接到另外一张表时,由于没有实际在表格关系中指定外键,而是在实体类中指定外键 导致关联表中的数据被删除时,JPA查询时,报错EntityNotFoundException 方案 ...

  9. 今日算法随笔:填充每个节点的下一个右侧节点指针 II

    题目链接:117. 填充每个节点的下一个右侧节点指针 II 题目描述 给定一个二叉树,填充它的每个 next 指针,让这个指针指向其下一个右侧节点.如果找不到下一个右侧节点,则将 next 指针设置为 ...

  10. 欢迎加入d3shop,一个DDD实战项目

    背景 整个<老肖的领域驱动设计之路>系列关于认知的核心部分已经基本闭环,但纸上得来终觉浅,还是需要通过实际操作来体会和验证我们的观点,接下来,我将通过一个实战项目来带着大家一起体验从需求到 ...