def replace(self, value): def replace_base(key): for pattern in self.patterns: try: return pattern.match(key).group('key') except AttributeError: # if match is None pass raise KeyError( "Could not find any matching key for %s in the base " "dictionary!" % key) value = bool(value) if hasattr(self, '_replace') and value == self._replace: return if not hasattr(self, '_replace'): self._replace = value return # if the value has changed, we change the key in the SubDict instance # to match the ones in the base dictionary (if they exist) for key, val in DictMethods.iteritems(self): try: if value: new_key = replace_base(key) else: new_key = self._get_val_and_base(key)[0] except KeyError: continue else: dict.__setitem__(self, new_key, dict.pop(self, key)) self._replace = value
def iterkeys(self): """Unsorted iterator over keys""" patterns = self.patterns replace = self.replace seen = set() for key in six.iterkeys(self.base): for pattern in patterns: m = pattern.match(key) if m: ret = m.group('key') if replace else m.group() if ret not in seen: seen.add(ret) yield ret break for key in DictMethods.iterkeys(self): if key not in seen: yield key
def __getitem__(self, key): if key in DictMethods.iterkeys(self): return dict.__getitem__(self, key) if not self.replace: return self.base[key] return self._get_val_and_base(key)[1]