在 Python 中编写并发/多线程代码时,遵循“请求宽恕比请求许可更容易”(EAFP)而不是“三思而后行”(LBYL)是否特别重要? Python 异常动态的特性意味着几乎任何事情(例如,属性删除)都可以在查找和跳跃之间发生——如果是这样,那有什么意义呢?例如,考虑
# LBYL
if hasattr(foo, 'bar'):
baz = foo.bar
对比
# EAFP
try:
baz = foo.bar
except AttributeError:
pass
在 LBYL 示例中,bar
属性可能会在实际调用 foo.bar
之前从 foo
中消失,您也一样从支票中得到什么?如果存在属性可能消失的风险,您无论如何都需要锁和/或 try/except 子句。
这里一个可能的论点是,这个例子做出了极其悲观的假设,即“对抗代码”正在运行,随时可能把地毯从你身下扯下来。在大多数用例中,这是极不可能的。
你的想法是正确的。补充几点:
如果该属性大部分时间都存在,try:except: 可能比LBYL 习语。
如果你不喜欢 try:except: 语法,你也可以这样写:
item = getattr(foo, 'bar', None)
if item is None:
....
else:
....
我是一名优秀的程序员,十分优秀!