我有以下片段,其中我找不到明顯的贏家。 你會推薦哪種款式?還有比這更好的東西嗎?只有在字典中存在密鑰時纔對值做些什麼
(假設self.task.flags
是一本字典)
in
和[]
if 'target_names' in self.task.flags: foo(self.task.flags['target_names'])
這提到了字典和密鑰的名稱兩次(違反幹)。
我也可以想象,這會在內部執行兩次相同的查找, 在第一種情況下丟掉值(
in
)。get
和臨時變量value = self.task.flags.get('target_names') if value: foo(value)
這消除了重複,而是一個臨時變量是不是很優雅。
當
{'target_names': None}
存在於self.task.flags
中時,其含義也與其他值有細微的差別。例外(「EAFP」)
try: foo(self.task.flags['target_names']) except KeyError: pass
聽說EAFP一般鼓勵Python,但我還是擔心 的例外可能是昂貴的,尤其是在關鍵 存在的機會不是很高。
這也可能掩蓋在
foo
內引發的任何異常。而
try
...except
結構可以在視覺上分散注意力;當涉及其他異常處理時,更多地使用 。
這完全取決於上下文。在不同情況下,其中一種方式比其他方式更優雅。 – thefourtheye
第二個假設並不好,因爲如果該值爲False或None,或者是'',0或任何空值,它將錯誤地不觸發該函數調用。 第二個只有在你知道可能的值範圍時纔有效。 –
@AlexanderHuszagh:謝謝;我已經說過它的含義有所不同,儘管它沒有包含其他的錯誤值('False','0','''')。 – musiphil