On 2/17/06, Adam Olsen <[EMAIL PROTECTED]> wrote: > if key in d: > dosomething(d[key]) > else: > dosomethingelse() > > try: > dosomething(d[key]) > except KeyError: > dosomethingelse()
I agree with the gut feeling that these should still do the same thing. Could we modify d.get() instead? >>> class ddict(dict): ... default_value_factory = None ... def get(self, k, d=None): ... v = super(ddict, self).get(k, d) ... if v is not None or d is not None or self.default_value_factory is None: ... return v ... return self.setdefault(k, self.default_value_factory()) ... >>> d = ddict() >>> d.default_value_factory = list >>> d.get('list', []) [] >>> d['list'] Traceback (most recent call last): File "<stdin>", line 1, in ? KeyError: 'list' >>> d.get('list').append(5) >>> d['list'] [5] There was never an exception raised by d.get so this wouldn't change (assuming the C is implemented more carefully than the python above). What are the problems with this other than, like setdefault, it only works on values with mutator methods (i.e., no counting dicts)? Is the lack of counting dicts that d.__getitem__ supports a deal breaker? >>> d.default_value_factory = int >>> d.get('count') += 1 SyntaxError: can't assign to function call How does the above either in dict or a subclass compare to five line or smaller custom subclasses using something like the following? def append(self, k, val): self.setdefault(k, []).append(val) or def accumulate(self, k, val): try: self[k] += val except KeyError: self[k] = val Michael -- Michael Urman http://www.tortall.net/mu/blog _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com