在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子句。
这里有一个可能的论点是,这个例子做出了极其悲观的假设,即“对抗性代码”正在运行,可能随时从你身下拉下地毯。在大多数用例中,这种可能性很小。
答案 0 :(得分:3)
你的想法是正确的。一些额外的要点:
如果该属性大多数时间都存在,请尝试:except:可能要快得多 LBYL成语。
如果你不喜欢try:except:syntax,你也可以写:
item = getattr(foo, 'bar', None)
if item is None:
....
else:
....