2013-04-12 55 views
10

如果尚未設置數值,則最多pythonic如何在dict中設置值?只有在數值尚未設置的情況下,才能在字典中設置值

在我的代碼使用if語句的時刻:

if "timeout" not in connection_settings: 
    connection_settings["timeout"] = compute_default_timeout(connection_settings) 

dict.get(key,default)是適當的代碼消耗的字典,而不是正在準備字典傳遞給另一個函數的代碼。你可以用它來設置的東西,但它沒有漂亮IMO:

connection_settings["timeout"] = connection_settings.get("timeout", \ 
    compute_default_timeout(connection_settings)) 

將評估即使字典包含關鍵的計算功能;錯誤。

默認值是當默認值相同時。

當然有很多次您設置不需要計算作爲默認設置的主要價值,他們當然可以使用dict.setdefault。但是更復雜的案例呢?要做到這一點

+0

考慮ç把你的問題的標題掛在更精確的東西上:「如何設置默認kwarg值以傳遞給另一個函數」。我覺得這個標題太籠統了。 –

回答

7

這是一個有點不回答,但我要說的是最Python化的if語句,你擁有它。你抵制了用__setitem__或其他方法對其進行單線化的衝動。您已經避免了邏輯中可能存在的錯誤,這是因爲當嘗試巧妙地利用短語and/or黑客行爲時可能發生的存在但錯誤的值。很明顯,計算功能在沒有必要時不會被使用。

它清晰,簡潔,易讀 - pythonic

2

一種方法是:

if key not in dict: 
    dict[key] = value 
+1

如上所述,[setdefault](https://docs.python.org/2/library/stdtypes.html#dict.setdefault)執行此操作。 – slaughter98

17

dict.setdefault將正好「僅在未設置值的情況下在字典中設置值」,這是您的問題。但是,您仍然需要計算將該值作爲參數傳遞的值,這不是您想要的值。

+2

對未來的谷歌來說:這可能不是問題提出者想要的答案,但它是你想要的答案。 – CoreDumpError

+0

@CoreDumpError此評論應該是對許多流行的問題:) –

1

我用下面的修改kwargs非默認值,並傳遞到另一個功能:

def f(**non_default_kwargs): 

    kwargs = { 
     'a':1, 
     'b':2, 
    } 
    kwargs.update(non_default_kwargs) 

    f2(**kwargs) 

這樣做的優點是

  • 你不必鍵入鍵兩次

  • 在一個單一的功能

012完成
+1

我想你是假設太多的用例。 OP可能沒有(或甚至不想)預先存在和預先計算的合理默認值集合。 – wim

-2

你可能需要dict.setdefault

創建一個新的字典,並設置一個值:

>>> d = {} 
>>> d.setdefault('timeout', 120) 
120 
>>> d 
{'timeout': 120} 

如果已經設置的值,dict.setdefault不會覆蓋它:

>>> d['port']=8080 
>>> d.setdefault('port', 8888) 
8080 
>>> d 
{'port': 8080, 'timeout': 120} 
+1

「將評估即使字典包含關鍵的計算功能;蟲」 – wim

+0

這是不是一個錯誤:'compute_default_timeout()'必須調用調用'dict.get()之前'凹口 - 可能不是什麼OP想要,但這是正確的行爲。 –

+0

引述來自的問題,所以很顯然,該行爲等同於一些東西,在OP已經考慮了錯誤(我不會稱之爲一個bug自己,但它仍然是不必要的和不希望的,這種情況下) – wim

-1

試試這個一個內膽:

connection_settings["timeout"] ||= compute_default_timeout(connection_settings) 
+0

這是哪個Python?在2.7中它說它的無效語法 – Will

+2

謝謝,這正是我所期待的!太優雅了! –

+1

謝謝,'SyntaxError'正是我一直在尋找的! – wim

相關問題