MCPcopy Create free account
hub / github.com/ActiveState/code / setdefault

Method setdefault

recipes/Python/579113_defdict/recipe-579113.py:152–196  ·  view source on GitHub ↗

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_)

Source from the content-addressed store, hash-verified

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

Callers 15

__init__Method · 0.95
updateMethod · 0.95
__getitem__Method · 0.45
guardFunction · 0.45
func_guardFunction · 0.45
__init__Method · 0.45
fromkeysMethod · 0.45
__init__Method · 0.45
__init__Method · 0.45
create_itemMethod · 0.45
_dir2Function · 0.45
exclude_refsMethod · 0.45

Calls 1

__getitem__Method · 0.45

Tested by

no test coverage detected