約亨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"]
這個人是合適的,當你想生成價值每次分開,並且不保留它在以後。
您需要學習查看python庫文檔。 – Marcin
你的例子不應該引發KeyError。三元運算符只評估其中一個結果。 – BrenBarn
在d'中使用''the_key'而不是'd.has_key('the_key')'。後者在Python 3中不存在。 – argentpepper