2016-03-24 34 views
1
self.dictionary.get(tuple_row_column, self.raiseError()) 
  1. 有一種方法,以提高錯誤而不定義將手動引發錯誤的方法?
  2. 即使字典包含密鑰,也會調用self.raiseError()方法。這是爲什麼?

回答

1

這是因爲.get首先評估默認參數,因爲它需要知道在缺少密鑰的情況下要返回什麼。正如註釋中指出的那樣 - 如果您的字典包含任何其布爾值計算爲False(如空字符串,0,False,[]等)的任何內容,則此方法將引發錯誤self.dictionary.get(tuple_row_column) or self.raiseError();無論哪種方式,如果你想提出一個錯誤,如果有一個缺失的關鍵,支架查找更pythonic。

關於第一個問題,你可以只是做

self.dictionary[tuple_row_column] # Raises KeyError if tuple_row_column not present in dictionary keys. 

如果你想要提高你的錯誤,你可以說:

try: 
    self.dictionary[tuple_row_column] 
except KeyError: 
    self.raiseError() 
+1

如果在布爾上下文中值爲False,則self.dictionary.get(tuple_row_column)或self.raiseError()不起作用 – niemmi

+0

@niemmi,非常好的一點,感謝您的支持! – Bahrom

+0

我認爲使用控制流的異常往往會被忽視。 –

2

Python是嚴格的評估,這意味着所有的函數調用的參數在之前被評估爲,該函數被調用。因此self.raiseError()必須運行,無論是否需要(與非嚴格或「懶惰」的語言沒有此限制)。

如果您使用的下標,而不是get

self.dictionary[tuple_row_column] 

這將提高KeyError如果沒有映射。