The rap against "while True:" loops
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Sun Oct 18 05:07:41 EDT 2009
On Sat, 17 Oct 2009 23:37:51 -0700, Paul Rubin wrote:
> Steven D'Aprano <steve at 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
More information about the Python-list
mailing list