Skip to content

Instantly share code, notes, and snippets.

@otherwiseguy
Created March 16, 2015 18:25
Show Gist options
  • Save otherwiseguy/fdbfae5cb2614766005b to your computer and use it in GitHub Desktop.
Save otherwiseguy/fdbfae5cb2614766005b to your computer and use it in GitHub Desktop.
import abc
import six
@six.add_metaclass(abc.ABCMeta)
class NotifyDict(dict):
NOT_FOUND = object()
@abc.abstractmethod
def on_create(self, key, val):
"""Callback for new key assignment"""
@abc.abstractmethod
def on_delete(self, key, val):
"""Callback for key deletion"""
@abc.abstractmethod
def on_update(self, key, old, new):
"""Callback for key update"""
def __delitem__(self, key):
self.pop(key)
def __setitem__(self, key, val):
try:
old = self[key]
except KeyError:
old = NotifyDict.NOT_FOUND
finally:
dict.__setitem__(self, key, val)
if old is NotifyDict.NOT_FOUND:
self.on_create(key, val)
else:
self.on_update(key, old, val)
def copy(self):
return type(self)(self)
__copy__ = copy
def update(self, d):
for k, v in d.items():
self[k] = v
def clear(self):
for k in self.keys():
del self[k]
def pop(self, key, *args):
x = dict.pop(self, key, *args)
self.on_delete(key, x)
return x
def popitem(self):
k, v = dict.popitem(self)
self.on_delete(k, v)
return (k, v)
def setdefault(self, key, default=None):
try:
return self[key]
except KeyError:
self[key] = default
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment