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 的性能就会高了(猜的)。


