On Sat, 17 Oct 2009 23:37:51 -0700, Paul Rubin wrote: > Steven D'Aprano <st...@remove-this-cybersource.com.au> writes: >> For the record, the four lines Paul implies are "confusing" are: >> >> try: >> d[key] += value >> except KeyError: >> d[key] = value > > Consider what happens if the computation of "key" or "value" itself > raises KeyError.
How does using a defaultdict for d save you from that problem? table = {101: 'x', 202: 'y'} data = {'a': 1, 'b': 2} d = collections.defaultdict(int) d[table[303]] += data['c'] It may not be appropriate to turn table and data into defaultdicts -- there may not be a legitimate default you can use, and the key-lookup failure may be a fatal error. So defaultdict doesn't solve your problem. If you need to distinguish between multiple expressions that could raise exceptions, you can't use a single try to wrap them all. If you need to make that distinction, then the following is no good: try: key = keytable[s] value = datatable[t] d[key] += value except KeyError: print "An exception occurred somewhere" But if you need to treat all three possible KeyErrors identically, then the above is a perfectly good solution. -- Steven -- http://mail.python.org/mailman/listinfo/python-list