On 27 November 2014 at 09:50, Guido van Rossum <gu...@python.org> wrote:
> On Wed, Nov 26, 2014 at 3:15 PM, Nick Coghlan <ncogh...@gmail.com> wrote:
>> This is actually the second iteration of this bug: the original
>> implementation *always* suppressed StopIteration. PJE caught that one before
>> Python 2.5 was released, but we didn't notice that 3.3 had brought it back
>> in a new, more subtle form :(
>>
>> It's worth noting that my "allow_implicit_stop" idea in the other thread
>> wouldn't affect subgenerators - those would still convert StopIteration to
>> RuntimeError unless explicitly silenced.
>
> You've lost me in this subthread. Am I right to conclude that the PEP change
> doesn't cause problems for contextlib(*), but that the PEP change also
> probably wouldn't have helped diagnose any contextlib bugs?

I think the PEP 479 semantics would have made both bugs (the one PJE
found in 2.5, and the newer one Isaac pointed out here) less cryptic,
in that they would have caused RuntimeError to be raised, rather than
silently consuming the StopIteration and continuing execution after
the with statement body.

With the new semantics, contextlib just needs to be updated to cope
with the StopIteration -> RuntimeError conversion, and Isaac's
"spurious success" bug will be fixed*.

Without PEP 479, I believe my only recourse to systematically
eliminate the risk of generator based context managers silently
consuming StopIteration would be to implement the "StopIteration ->
gen.close()" workaround, and that would be a backwards incompatible
change in its own right.

Cheers,
Nick.

P.S. *(This does mean I was wrong about allow_implicit_stop being
useful to contextlib, but I still think the decorator is useful for
cases where StopIteration is being used to terminate the generator on
purpose)

-- 
Nick Coghlan   |   ncogh...@gmail.com   |   Brisbane, Australia
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to