Um auf die Antwort von sqreept zurückzugreifen dict
, verhält sich eine Unterklasse davon wie gewünscht:
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
Auf diese Weise kann Werte von vorhandenen Schlüsseln werden geändert zu None
, aber die Zuordnung None
zu einem Schlüssel, der nicht existiert ein no-op ist. Wenn Sie Einstellung ein Element wollte entfernen sie aus dem Wörterbuch , wenn es bereits vorhanden ist , können Sie dies tun:None
def __setitem__(self, key, value):
if value is None:
if key in self:
del self[key]
else:
dict.__setitem__(self, key, value)
Werte von None
können eintreten, wenn Sie sie während des Baus weitergeben. Wenn Sie dies vermeiden möchten, fügen Sie eine __init__
Methode hinzu, um sie herauszufiltern:
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
Man könnte es auch generische machen , indem es zu schreiben , so dass Sie kann in passiert den gewünschten Zustand , wenn das Wörterbuch zu erstellen:
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
assert "foo" not in d
'orange': orange if orange else default
Syntax verwenden.