在 Python 中编写并发/多线程代码时,遵循“比许可更容易请求宽恕”(EAFP) 的习惯用法而不是“Look Before You Leap”(LBYL) 是否特别重要? Python 异常动态的特性意味着几乎任何事情(例如,属性删除)都可能在查找和跳跃之间发生——如果是这样,那又有什么意义呢?例如,考虑

# LBYL
if hasattr(foo, 'bar'):
    baz = foo.bar

相对
# EAFP
try:
    baz = foo.bar
except AttributeError:
    pass

在 LBYL 示例中,bar 属性可能会在对 foo 进行实际调用之前从 foo.bar 中消失,那么您从检查中获得了什么吗?如果存在属性可能消失的风险,则无论如何都需要锁定和/或 try/except 子句。

这里的一个可能的论点是,这个例子做出了一个极其悲观的假设,即“对抗代码”正在运行,它可以在任何时候把你从下面扯下来。在大多数用例中,这是极不可能的。

最佳答案

你的想法是正确的。补充几点:

如果该属性大部分时间都存在, try:except: 可能比
LBYL 习语。

如果你不喜欢 try: except: 语法,你也可以这样写:

item = getattr(foo, 'bar', None)
if item is None:
    ....
else:
    ....

关于python - EAFP/LBYL 的并发影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/644052/

10-09 00:45