Confused compare function :)
Dave Angel
d at davea.name
Thu Dec 6 09:40:51 EST 2012
On 12/06/2012 08:58 AM, Chris Angelico wrote:
> On Fri, Dec 7, 2012 at 12:33 AM, Thomas Rachel
> <nutznetz-0c1b6768-bfa9-48d5-a470-7603bd3aa915 at spamschutz.glglgl.de>
> wrote:
>> Am 06.12.2012 09:49 schrieb Bruno Dupuis:
>>
>>> The point is Exceptions are made for error handling, not for normal
>>> workflow. I hate when i read that for example:
>>>
>>> try:
>>> do_stuff(mydict[k])
>>> except KeyError:
>>> pass
>> I would do
>>
>> try:
>> value = mydict[k]
>> except KeyError:
>> pass
>> else:
>> do_stuff(k)
>>
>> Why? Because do_stuff() might raise a KeyError, which should not go
>> undetected.
> (Assuming first off that you meant "do_stuff(value)", not
> "do_stuff(k)", in that last line)
>
> That has quite different functionality, though. The original wouldn't
> have called do_stuff at all if k is not in dict, behaviour which is
> matched by both his EAFP and his LBLY. But your version, in the event
> of a KeyError, will call do_stuff with the previous value of value, or
> raise NameError if there is no such previous value.
Nope. The else clause will only execute if no exception occurs in the
value= line.
> I don't think
> that's intentional.
>
> The only way around it that I can see is an extra condition or jump -
> something like:
>
> def call_if_present(mydict,k,do_stuff):
> """Equivalent to
> do_stuff(mydict[k])
> if the key is present; otherwise, does not call do_stuff, and
> returns None."""
> try:
> value = mydict[k]
> except KeyError:
> return
> return do_stuff(value)
>
> It'll propagate any other exceptions from the subscripting (eg
> TypeError if you give it a list instead of a dict), and any exceptions
> from do_stuff itself. But it's getting a bit unwieldy.
>
> ChrisA
--
DaveA
More information about the Python-list
mailing list