2011-09-07 83 views
2

我想在創建python字典時動態添加/不添加字段。創建python字典時動態字段插入

def my_func(input): 
    return { 
     'foo':'bar', 
     None if input == None else 'baz':input 
     } 

其實,這工作,但它返回{'foo': 'bar', None: None}

我想它返回{'foo': 'bar'}。有沒有辦法做到這一點?

PS。我知道這個問題有點學術性。人們可以很容易做到:

def my_func(input): 
    ret = { 
     'foo':'bar', 
      } 
    if input != None: 
     ret['baz'] = input 
    return ret 

但我喜歡第一個清潔。

[編輯]

,我們可以使用一個__metaclass__來解決這個問題?

+1

我看不出不把「巴茲」鍵進入你的字典當輸入爲無的優勢。這樣你就必須在後面的代碼中檢查_key是否存在。如果_value是None_,那麼這個檢查將是一個檢查。無論哪種方式,你必須先檢查... ... –

+0

通常是的,但我把這本字典餵給外部庫。這吹到{'foo':'bar',None:None}和{'foo':'bar','baz':None}。 – RickyA

回答

0

你可以想collections.defaultdict

collections.default作品像一個正常的字典有一個例外,你可以設置一個default_factory,當你做一個[「測試」]和關鍵是__missing__那麼它會調用默認出廠。在默認工廠中,您可以使其執行任何您想要將其設置爲默認值的操作。

+0

這可以解決消耗這個字典的問題。但是,這種方式我不能使用默認的字典構造函數,所以它有點違背了目的。 – RickyA

0

我完全同意jellybean。 但如果你真的需要它,真的需要它作爲oneliner,那麼你可以這樣做:

def my_func(input): 
    return dict([(k,v) for k,v in (('foo', 'bar'), ('buz', inp)) if v]) 

當然這不包括情況下,當一些其他的值也無...(和它的醜陋的。我真的不知道爲什麼我發佈了這:))

而且,你發佈的第二個變體imho,對你來說絕對沒問題。

def my_func(input): 
    ret = {'foo':'bar'} 
    if input: 
     ret['baz'] = input 
    return ret 
+0

好吧,那確實很醜陋;)別擔心,我不會使用它,儘管它是一個有趣的解決方案 – RickyA