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. Spring 相关知识

    https://www.bilibili.com/video/BV1gW411W7wy?spm_id_from=333.788.b_636f6d6d656e74.173 老雷的Spring注解驱动 源 ...

  2. 推荐一款Python开源移动应用安全测试分析工具!!!

    今天给大家推荐一个安全测试相关的开源项目:nccgroup/house 1.介绍 它是一个由 NCC Group 开发的,一个基于Frida和Python编写的动态运行时移动应用分析工具包,提供了基于 ...

  3. WPF控件结构与Content理解

    WPF控件结构 WPF中控件继承图 我们平时所用的容器如Grid.StackPanel等都是继承Panel 控件类型分为3组:内容控件.Items控件.TextBoxBase 如何理解Content? ...

  4. PHP中的Malformed UTF-8 characters错误解决

    在PHP开发中,开发者经常会遇到Malformed UTF-8 characters错误.这个错误通常是由于代码中存在无效的UTF-8字符而引起的.本篇博客将为您介绍如何解决这个问题. 什么是UTF- ...

  5. Json Number Format 异常 Expected an int but was 2168520652 at line 1 column 325

    某变量声明为Integer类型,报json 转换异常 超出了Integer的最大值2147483647, 将类型修改为BigInteger即可,BigInteger:支持任意精度的整数 写Bean时, ...

  6. 【YashanDB数据库】YAS-02032 column type is incompatible with referenced column type

    [标题]错误码处理 [问题分类]外键约束创建报错 [关键字]YAS-02032 [问题描述]设置外键约束报错,数据元数据不正确. [问题原因分析]外键字段类型不支持,比如varchar2(64) ,指 ...

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

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

  8. CSS & JS Effect – Image hover animation

    效果 效果来自: webflow 的一个模板 需求解释 有 3 给元素, 图片, overlay(黑影), link mouse enter 的时候, 图片要 zoom in. overlay 要 f ...

  9. Figma 学习笔记 – Auto Layout

    用途 Auto Layout 有点像 CSS 的 Flex, 它还带有 responsive 的概念.使用它以后可以替代掉不少 constraints 的写法. 用法 一个 parent 抱着多个 c ...

  10. 选择:Qt Creator、Qt Designer、Qt Design Studio,三种开发工具,您选择哪一种?

    前言 本文介绍了三种QT开发工具的特点,以及各自的优点和缺点. QT三种工具对比 QT提供的工具 Qt Creator: 扮演的是QT Widgets和QT QML的IDE的角色. 优点: 可以编写C ...