2016-02-05 18 views
0

我有字典,如果該鍵不存在,我想爲其分配一個值。我發現自己寫這個漂亮常:在不存在的字典中設置默認值

class Document(object): 
    def __init__(properties): 
     self.properties = properties 
     self.properties['created']=properties.get('created',datetime.datetime.now()) 
     self.properties['foo']=properties.get('foo','bar') 

有人建議這相當於:

 self.properties = {'created',datetime.datetime.now(),'foo':'bar'} 
     self.properties.update(properties) 

是否有使用一個或其他任何利益? 我希望能夠在一行中完成這項任務,但不幸的是update()方法不會返回修改過的字典。是否有一個很好的高性能單線式替代品?

+0

這僅僅是一個玩具例子,可能有其他的屬性,這就是爲什麼第二個版本會是一種怎樣的改進過的第一個在可讀性方面我可以從其他地方得到那本字典。 –

回答

1

如果你能夠使用Python 3.5,additional unpacking generalizations讓一切變得簡單:

class Document(object): 
    def __init__(self, properties): 
     self.properties = {'created': datetime.datetime.now(), **properties} 

如果dict是保證屬性只有字符串鍵,你也可以做任何版本的Python如下:

 self.properties = dict({'created': datetime.datetime.now()}, **properties) 

雖然這是一個有點難看,對於任何版本的Python,你可以得到額外的拆包概括了類似的效果:

from itertools import chain 

... 
     self.properties = dict(chain({'created': datetime.datetime.now()}.items(), properties.items())) 

最後,如果這些都不是一個選項,你可以至少避免單獨get和存儲操作,通過使用setdefault

 self.properties = properties 
     properties.setdefault('created', datetime.datetime.now()) 

setdefault行爲像get,但它也存儲在默認值沒有現有的密鑰。請注意,與基於get的版本類似,這將保留調用者提供的精確dict,並對其進行變異,並且將來可能會受到調用者的突變。所有其他解決方案避免這一點。爲了解決這個問題對於任何一個getsetdefault,更改爲:

 self.properties = properties.copy() 
     self.properties.setdefault('created', datetime.datetime.now()) 
+0

我在2.7,但你的第二個例子正是我想要的。 –

1

您可以使用defaultdict從集合模塊:

from collections import defaultdict 
>>> d=defaultdict(datetime.datetime.now) 
>>> d['created'] 
datetime.datetime(2016, 2, 4, 16, 44, 42, 767328) 

你也可以使用setdefault,一個dict方法:

class Document(object): 
    def __init__(self,properties): 
     self.properties = properties 
     self.properties.setdefault('created',datetime.datetime.now()) 

使用setdefault不會將其他字典值datetime.datetime.now() ,所以它可能更適合你。

+2

'd = defaultdict(datetime.datetime.now)',不需要一個醜陋的lambda –

+0

它需要被調用,所以你刪除了parens。 –

+0

我明白你的觀點,並不是所有的財產都是同一種。讓我編輯這個問題。 –