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