[Python-Dev] PEP 377 - allow __enter__() methods to skip the statement body

Aahz aahz at pythoncraft.com
Sun Mar 15 23:55:01 CET 2009


On Sun, Mar 15, 2009, Michael Foord wrote:
> Aahz wrote:
>> On Sun, Mar 15, 2009, Michael Foord wrote:
>>>   
>>> Note that using exceptions for control flow can  be bad for other   
>>> implementations of Python. For example exceptions on the .NET 
>>> framework  are very expensive. (Although there are workarounds such 
>>> as not really  raising the exception - but they're ugly).
>>>
>>> Isn't it better practise for exceptions to be used for exceptional   
>>> circumstances rather than for control flow?
>>
>> It seems to me that we as a development community already made a decision
>> when we switched to StopIteration as the primary mechanism for halting
>> ``for`` loops.  (Not that it was really a new decision because parts of
>> the Python community have always advocated using exceptions for control
>> flow, but the ``for`` loop enshrines it.)  I doubt that using exceptions
>> for control flow in ``with`` blocks will cause anywhere near so much a
>> performance degradation.
>   
> Well, StopIteration is still an implementation detail that only
> occasionally bleeds through to actual programming. It says nothing
> about whether using exceptions for non-exceptional circumstances
> (control flow) is good practise. Personally I think it makes the
> intent of code less easy to understand - in effect the exceptions
> *are* being used as a goto.

Let me know how you'd rewrite this more clearly without a control-flow
exception:

        try:
            for field in curr_fields:
                for item in record[field]:
                    item = item.lower()
                    for filter in excludes:
                        if match(item, filter):
                            raise Excluded
        except Excluded: 
            continue 

This is pretty much the canonical example showing why control-flow
exceptions are a Good Thing.  They're a *structured* goto.
-- 
Aahz (aahz at pythoncraft.com)           <*>         http://www.pythoncraft.com/

Adopt A Process -- stop killing all your children!


More information about the Python-Dev mailing list