在 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/