为了搭载 sqreept 的答案,这里有一个子类,dict
其行为符合要求:
class DictNoNone(dict):
def __setitem__(self, key, value):
if key in self or value is not None:
dict.__setitem__(self, key, value)
d = DictNoNone()
d["foo"] = None
assert "foo" not in d
这将允许将现有键的值更改为None
,但分配None
给不存在的键是无操作的。如果您想将一个项目设置为从字典None
中删除它(如果它已经存在),您可以这样做:
def __setitem__(self, key, value):
if value is None:
if key in self:
del self[key]
else:
dict.__setitem__(self, key, value)
如果你在构建过程中传递它们的值,它们None
就可以进入。如果你想避免这种情况,添加一个__init__
方法来过滤掉它们:
def __init__(self, iterable=(), **kwargs):
for k, v in iterable:
if v is not None: self[k] = v
for k, v in kwargs.iteritems():
if v is not None: self[k] = v
您也可以通过编写它来使其通用,这样您就可以在创建字典时传入所需的条件:
class DictConditional(dict):
def __init__(self, cond=lambda x: x is not None):
self.cond = cond
def __setitem__(self, key, value):
if key in self or self.cond(value):
dict.__setitem__(self, key, value)
d = DictConditional(lambda x: x != 0)
d["foo"] = 0 # should not create key
assert "foo" not in d