Skip to content

Instantly share code, notes, and snippets.

@shimizukawa
Created November 27, 2016 04:40
Show Gist options
  • Save shimizukawa/43e13556c2f49427ad4b84e98e37f93d to your computer and use it in GitHub Desktop.
Save shimizukawa/43e13556c2f49427ad4b84e98e37f93d to your computer and use it in GitHub Desktop.
warn when deprecated dict key is accessed
class Foo(object):
def __init__(self):
self.data = DelegateDict()
self.data.set_delegation('py:class', 'py:class_stack')
#: dict wrapper to warn deprecation
class DelegateDict(dict):
def __init__(self, *args, **kw):
super(DelegateDict, self).__init__(*args, **kw)
self._delegation = {}
self._warns = {}
def set_delegation(self, from_, to_, warn=DeprecationWarning):
self._delegation[from_] = to_
self._warns[from_] = warn
def _delegate(self, key):
new_key = self._delegation.get(key, key)
warn = self._warns.get(key)
if warn:
if True: # debug
print('access to {} from {}'.format(
key, sys._getframe().f_back.f_back.f_code.co_name))
warnings.warn('Use {} instead of {}'.format(new_key, key),
self._warns[key], stacklevel=3)
return new_key
_d = _delegate
def __delitem__(self, key):
super(DelegateDict, self).__delitem__(self._d(key))
def __getitem__(self, key):
return super(DelegateDict, self).__getitem__(self._d(key))
def __setitem__(self, key, value):
return super(DelegateDict, self).__setitem__(self._d(key), value)
def get(self, key, default=None):
return super(DelegateDict, self).get(self._d(key), default)
def setdefault(self, key, default=None):
return super(DelegateDict, self).setdefault(self._d(key), default)
def update(self, e=None, **f):
raise NotImplementedError
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment