Created
March 16, 2015 18:25
-
-
Save otherwiseguy/fdbfae5cb2614766005b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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