Jochen Ritzel 的回答是 99.9999% 的正确方法:
variable = d.get("the key", "something")
正如他所指出的,它不允许您短路默认值的评估。你通常不在乎。它的默认值是"something"
,你当然不知道。仅当默认值是危险的或非常昂贵的生成时才重要。
只有在这种情况下,您才能并且应该使用您的想法。除了你想要in
而不是has_key
(因为它更具可读性,更快,并且不被弃用):
variable = d["the key"] if "the key" in d else expensiveComputation()
但是,使用if
语句而不是三元表达式可能值得,因为您避免使用的事实很expensiveComputation
重要,并且您希望它更明显:
if "the_key" in d:
variable = d["the key"]
else:
variable = expensiveComputation()
如果您希望默认情况很少见,则更好:
try:
variable = d["the key"]
except KeyError:
variable = expensiveComputation()
如果由于某种原因您需要避免两次查找密钥,并且您也无法处理异常,并且您需要一次短路默认值:
sentinel = object()
variable = d.get(sentinel)
if variable == sentinel:
variable = expensiveComputation()
是的,您可以将所有这些都包装在一个函数中,这样它就可以成为一个单行代码,但是您几乎肯定不想隐瞒您同时做三件罕见的事情的事实。
或者,当然,你可以这样做:
d = collections.defaultdict(expensiveComputation)
然后,它只是:
variable = d["the key"]
这具有在返回给您之前设置d["the key"]
为的副作用,因此稍后调用将返回相同的值。如果这听起来合适,这是最好的答案;如果您永远不会使用相同的密钥两次,或者这些东西很大而且很浪费,等等,这是一个坏主意。expensiveComputation()
d["the key"]
或者,或者,您可以覆盖该dict.__missing__
方法而不是使用defaultdict
:
class MyDict(dict):
def __missing__(self, key):
return expensiveComputation()
然后,再次,它只是:
variable = d["the key"]
当您希望每次都单独生成值而不是将其保留以供以后使用时,此选项是合适的。