Щоб отримати відгук на відповідь 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
assert "foo" not in d
'orange': orange if orange else default
синтаксис.