[Python-Dev] PEP 377 - allow __enter__() methods to skip the statement body
Michael Foord
fuzzyman at voidspace.org.uk
Mon Mar 16 00:00:32 CET 2009
Aahz wrote:
> 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.
>
You didn't include all the code - so impossible to match the exact
semantics. Breaking out of multiple loops with a return is a cleaner way
to handle it IMHO.
def find_excludes():
for field in curr_fields:
for item in record[field]:
item = item.lower()
for filter in excludes:
if match(item, filter):
return
while something:
find_excludes()
Michael
--
http://www.ironpythoninaction.com/
http://www.voidspace.org.uk/blog
More information about the Python-Dev
mailing list