[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