我對dict.get() 的理解是,如果鍵存在,則不會對默認引數進行評估。并且一些訊息來源含蓄地離開了這種解釋。但事實證明并非如此。
讓我們假設有一個 dict 具有 str 或 int 型別的整數鍵。因此,檢索值模塊鍵型別的一行將.get與依賴于替代型別鍵的默認值一起使用。
>>> d = {'2':4}
>>> d.get(2, d['2'])
4
>>> d.get('2', d[2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 2
如果鍵存在,評估默認引數有什么意義?這只是該方法的糟糕設計還是我過度概括了 的預期功能.get()?
uj5u.com熱心網友回復:
這種情況下的主要區別在于,d[2]必須在將運算式作為引數傳遞給get函式之前對其進行計算。
發生例外是因為您在此運算式中參考了一個2不存在的整數鍵,然后再檢查d['2']該字典中是否存在該鍵。
請找到參考:運算式 6.3.4。通話
主函式必須評估為可呼叫物件(用戶定義的函式、內置函式……以及所有具有 __call__() 方法的物件都是可呼叫的)。 在嘗試呼叫之前評估所有引數運算式。
uj5u.com熱心網友回復:
Python 不是惰性語言,因此函式的所有引數都會在呼叫函式之前進行評估。這意味著,在您的第二個示例中,d[2]將在呼叫d.get. 有一些語言(如 Haskell)會接受此代碼,因為引數僅在需要時進行評估。
uj5u.com熱心網友回復:
引數總是被評估,我不知道有任何主流程序語言允許宣告函式,以便引數的評估將被推遲,直到以某種方式明確解決。
如何推遲評估:
d = { '2': 4 }
x = d.get('3', lambda: d[2])
print(x() if callable(x) else x)
.. 但這是一個非常愚蠢的例子。
編輯:另一種(危險的)推遲評估的方法:
x = d.get('2', False) or d[2]
.. 假設沒有來自 dict 的有效結果評估為False(like 0or None)。這是用腳射擊自己的好方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377174.html
