EAFP / LBYL的并发含义

时间:2009-03-13 18:34:00

标签: python multithreading

在Python中编写并发/多线程代码时,遵循“更容易请求宽恕而不是权限”(EAFP)的习惯,而不是“先看你跳跃”(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子句。

这里有一个可能的论点是,这个例子做出了极其悲观的假设,即“对抗性代码”正在运行,可能随时从你身下拉下地毯。在大多数用例中,这种可能性很小。

1 个答案:

答案 0 :(得分:3)

你的想法是正确的。一些额外的要点:

如果该属性大多数时间都存在,请尝试:except:可能要快得多 LBYL成语。

如果你不喜欢try:except:syntax,你也可以写:

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