阅读目录

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

LBYL: Look Before You Leap,即事先检查;

EAFP: It’s Easier to Ask Forgiveness than Permission,即不检查,出了问题由异常处理来处理。

异常处理总是比事先检查容易,因为你很难提前想到所有可能的问题。所以,一般情况下编码时会倾向使用EAFP风格,但它也不是适应所有的情况。两个风格的优缺点如下:

d = {} words = [‘a’, ‘d’, ‘a’, ‘c’, ‘b’, ‘z’, ‘d’] # LBYL for w in words: if w not in d: d[w] = 0 d[w] += 1 # EAFP for w in words: try: d[w] += 1 except KeyError: d[w] = 1
对于 LBYL ,容易打乱思维,本来业务逻辑用一行代码就可以搞定的。却多出来了很多行用于检查的代码。防御性的代码跟业务逻辑混在一块降低了可读性。而 EAFP ,业务逻辑代码跟防御代码隔离的比较清晰,更容易让开发者专注于业务逻辑。不过,异常处理会影响一点性能。因为在发生异常的时候,需要进行保留现场、回溯traceback等操作。但其实性能相差不大,尤其是异常发生的频率比较低的时候。

另外,需要注意的是,如果涉及到原子操作,强烈推荐用 EAFP 风格。比如我某段程序逻辑是根据redis的key是否存在进行操作。如果先if exists(key),然后do something。这样就变成2步操作,在多线程并发的时候,可能key的状态已经被其他线程改变了。而用EAFP风格则可以确保原子性。

PS:在使用EAFP风格捕获异常时,尽量指明具体的异常,不要直接捕获Exception。否则会捕获到其他未知的异常,如果有问题,你会很难去定位(debug)。

EAFP vs LBYL相关推荐

  1. python怎么将if和try一起用_Python使用try/catch还if效率更高一些?

    "请求原谅"和"三思而后行"(有时也称为"请求许可")是编写代码的两种相反的方法.如果你"三思而后行",你首先要检查一切 ...

  2. python缩写词_如果连这10个Python缩写都不知道,那你一定是Python新手!

    在本文中,我将告诉大家一些容易忽视的Python编程原理.规则和一些有趣的事实. 简介 对于许多开始学习编程的人来说,Python已经成为他们的首选.Python有非常直观的语法和支持动态类型的灵活性 ...

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

    简介 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类人,我给大 ...

  4. python 鸭子类型_Python中的鸭子输入是什么?

    python 鸭子类型 Python遵循EAFP(比许可更容易请求宽恕)而不是LBYL(跨越式). EAFP的Python哲学在某种程度上与其"鸭子打字"编码风格有关. 当程序员在 ...

  5. 【干货】Python编程惯例

    Python编程惯例 "惯例"这个词指的是"习惯的做法,常规的办法,一贯的做法",与这个词对应的英文单词叫"idiom".由于Python跟 ...

  6. 检索方法应该返回#39;null#39;还是无法产生返回值时引发异常? [关闭]

    已关闭 . 这个问题是 基于观点的 . 它当前不接受答案. 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答. 3年前关闭. 我有一种方法,应该在找到对象后返回它. 如果找不到, ...

  7. 如何知道对象在Python中是否具有属性

    有没有办法在Python中确定对象是否具有某些属性? 例如: >>> a = SomeClass() >>> a.someProperty = value > ...

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

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

  9. 待完成 14 python进阶

    用好标准库的模块 errno 通过系统errno精准捕获异常内容 >>> import os >>> os.kill(12345, 0) Traceback (mo ...

最新文章

  1. dbscan算法中 参数的意义_基于变参数的DBSCAN算法
  2. 选项窗格JTabbedPane
  3. 【Android游戏开发十五】关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记! ....
  4. GUI编程笔记(java)04:GUI(HelloWorld)窗体案例
  5. python安全攻防---爬虫基础---BeautifulSoup解析
  6. 【codevs1063NOIP04PJ】合并果子,贪心の钻石
  7. 合格PHP工程师的知识结构
  8. golang使用go-sql-driver实现mysql增删改操作
  9. win10下用ffmpeg推流拉流
  10. 金蝶KIS保存记账凭证的时候提示“在清除未下设辅助账的科目所在的会计分录中的核算项目代码时出现冲突或错误,凭证还没有被保存,请您稍后重试。”错误
  11. do还是doing imagine加to_doing与to do的用法
  12. 艾司博讯:拼多多直通车自动调价要不要开启
  13. 怎样使用Outlook连接Hotmail
  14. 七代处理器装win7_7代cpu能装win7旗舰版吗?七代处理器 不能装win7的解决方法
  15. 线程的8大基础知识(持续更新)第一章
  16. 知云文献翻译打不开_神器推荐丨知云文献翻译软件 WIN/MAC/IOS/ANDROID/网页版
  17. 计算机网络 理解流量控制与SACK机制
  18. vi linux insert切换该行第一个字符,Linux之Vi命令讲解
  19. 前端系列之HTML(表格)
  20. 微信小程序:去除自带顶部导航栏

热门文章

  1. django model filter_django中探索如何提高查询数据效率
  2. Spring管理Bean的生命周期
  3. java的jbutton啥意思,Jbutton和Jpanel和JFrame之间的区别?
  4. 整理Java相关的工具类Utils,持续更新中,建议收藏【目前更新至24】
  5. Struts2-从值栈获取list集合数据(三种方式)
  6. postman中POST请求时参数包含参数list设置
  7. “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)
  8. 2019中山大学程序设计竞赛
  9. 在那天的雪停息之前β
  10. 2021暑假实习-SSM超市积分管理系统-day05笔记