在Python中编写并发/多线程代码时,遵循“宁愿请求原谅,而不是事先获得许可”(EAFP)习语尤为重要,而不是“先看再跳”(LBYL)。 Python的极其动态的特性意味着几乎任何事情(例如属性删除)都可能发生在看和跳之间 - 如果是这样,那还有什么意义呢?例如,请考虑:
对比。
在 LBYL 示例中,调用
这里一个可能的论点是,此示例采取了极度悲观的假设,即可能运行“对抗性代码”,随时可能使您丧失优势。在大多数情况下,这种情况是非常不可能的。
# LBYL
if hasattr(foo, 'bar'):
baz = foo.bar
对比。
# EAFP
try:
baz = foo.bar
except AttributeError:
pass
在 LBYL 示例中,调用
foo.bar
之前,foo
的属性 bar
可能会消失,那么这个检查有什么作用呢?如果存在属性可能消失的风险,您需要使用锁和/或 try/except 子句。这里一个可能的论点是,此示例采取了极度悲观的假设,即可能运行“对抗性代码”,随时可能使您丧失优势。在大多数情况下,这种情况是非常不可能的。