Pour faire suite à la réponse de sqreept, voici une sous-classe de dict
qui se comporte comme souhaité :
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
Cela permettra aux valeurs des clés existantes d'être modifié a None
mais en attribuant None
à une clé qui n'existe pas est un échec. Si vous vouliez attribuer un élément à None
a supprimer pour le retirer du dictionnaire s'il existe déjà, vous pourriez faire ceci :
def __setitem__(self, key, value):
if value is None:
if key in self:
del self[key]
else:
dict.__setitem__(self, key, value)
Valeurs de None
peut entrer si vous les faites passer pendant la construction. Si vous voulez éviter cela, ajoutez un __init__
pour les filtrer :
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
Vous pouvez également le rendre générique en l'écrivant de manière à ce que vous puissiez passer la condition souhaitée lors de la création du dictionnaire :
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