Example #1
0
    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
Example #2
0
 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
Example #3
0
 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]