Behaves like standard dict.setdefault, but uses value in _default attribute if no default parameter specified. >>> dd = DefDict(default=5) >>> dd.setdefault('a', 10), dd.setdefault('b'), dd.setdefault('b', 11) (10, 5, 5) >>> print dd {'a': 10, 'b': 5
(self, key, value = _use_default_, collision=_RETAIN_)
| 150 | self.setdefault(key, self._default, collision) |
| 151 | |
| 152 | def setdefault(self, key, value = _use_default_, collision=_RETAIN_): |
| 153 | """Behaves like standard dict.setdefault, but uses value in _default attribute |
| 154 | if no default parameter specified. |
| 155 | |
| 156 | >>> dd = DefDict(default=5) |
| 157 | >>> dd.setdefault('a', 10), dd.setdefault('b'), dd.setdefault('b', 11) |
| 158 | (10, 5, 5) |
| 159 | >>> print dd |
| 160 | {'a': 10, 'b': 5} |
| 161 | |
| 162 | A collision function can also be passed to override setdefault's |
| 163 | standard RETAIN semantics. |
| 164 | |
| 165 | >>> dd.setdefault('a', collision=_OVERWRITE_), dd.setdefault('b', 6, _ADD_) |
| 166 | (5, 11) |
| 167 | >>> dd.setdefault('b', 12, _MAX_), dd.setdefault('b', 10, _MAX_) |
| 168 | (12, 12) |
| 169 | >>> dd.setdefault('c', 10, _RAISE_) |
| 170 | 10 |
| 171 | >>> dd.setdefault('c', 10, _RAISE_) |
| 172 | Traceback (most recent call last): |
| 173 | KeyAlreadyExists: 'c' |
| 174 | >>> print dd |
| 175 | {'a': 5, 'b': 12, 'c': 10} |
| 176 | |
| 177 | Default value is NOT copied if non-simple type (ex. list, dict). |
| 178 | If values must be distinct objects, then you must subclass and |
| 179 | override this method or __setitem__() to create a copy of the default. |
| 180 | |
| 181 | >>> dd = DefDict(default=[]) |
| 182 | >>> dd.setdefault(1), dd.setdefault(2) |
| 183 | ([], []) |
| 184 | >>> dd[1] is dd[2] #keys 1 and 2 do have distinct list objects |
| 185 | True |
| 186 | >>> dd[2].append(42) #will also change value in dd[1]!!! |
| 187 | >>> print dd |
| 188 | {1: [42], 2: [42]} |
| 189 | """ |
| 190 | key_absent = key not in self #fail immediately if key unhashable |
| 191 | if value == _use_default_: value = self._default #XXX should make copy for non-simple default, or rely on __setitem__() to make copy? |
| 192 | if collision == _OVERWRITE_ or key_absent: |
| 193 | self[key] = value #note: subclass may override setitem method so value may be modified |
| 194 | else: |
| 195 | collision(self, key, value) |
| 196 | return dict.__getitem__(self, key) #may wish to allow dd[key] to insert key in dd with default value |
| 197 | |
| 198 | def get(self, key, *args): |
| 199 | """Behaves like standard dict.get, but uses value in _default attribute |
no test coverage detected