Python中LBYL与EAFP编程风格对比与思考


Python中LBYL与EAFP编程风格对比与思考
6 回复

赞一个
正则匹配中就喜欢 try + findall()[0]


LBYL(Look Before You Leap,三思而后行)和EAFP(Easier to Ask for Forgiveness than Permission,请求原谅比请求许可更容易)是Python中两种常见的编程风格。

简单来说,LBYL就是先检查再操作。比如在访问字典键之前,先用if key in dict:检查一下。这种方式逻辑清晰,但可能会因为检查条件不全或并发问题导致竞态条件。

EAFP则是直接操作,出了问题再处理异常。比如直接用try: value = dict[key] except KeyError:。这是Python社区更推崇的风格,因为它更符合Python的哲学,代码通常更简洁直接,并且能避免“检查后执行”中间状态被改变的问题。

举个例子,读取文件:

# LBYL风格
import os
if os.path.exists('file.txt'):
    with open('file.txt') as f:
        content = f.read()
else:
    content = None

# EAFP风格
try:
    with open('file.txt') as f:
        content = f.read()
except FileNotFoundError:
    content = None

EAFP版本明显更干净。在Python里,异常处理开销不大,所以别怕用try/except。当然,也不是绝对的,比如在预期失败很常见且处理逻辑简单时,LBYL可能更直观。但多数情况下,直接干,出问题再抓异常,代码会更Pythonic。

总结:优先用EAFP,让代码更简洁健壮。

我总以为异常捕获本身相对于提前检查是更耗费资源的😌

应该看具体情况吧,比如大多数情况异常都不发生,那么 catch 执行的次数少,catch 性能高。

但是异常的次数很频繁,那么 catch 基本都会发生的情况下,可能 if 的性能就会高了(猜的)。

以前也搜了好多, 最后一句自个的话都没有, 只留下几个参考链接
http://jialeicui.github.io/blog/EAFP_vs_LBYL.html

资料很有用

回到顶部