我有字典,如果该密钥不存在,我想为其分配一个值。我发现自己经常写这个:
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)
您可以使用收藏模块中的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
无法将其他dict值设置为datetime.datetime.now()
,因此它可能更适合您。
答案 1 :(得分: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
,对其进行变更,并且将来可能会被调用者变更。所有其他解决方案都避免这种情要解决get
或setdefault
的问题,请更改为:
self.properties = properties.copy()
self.properties.setdefault('created', datetime.datetime.now())