[Python-Dev] PEP 340 -- loose ends

Shane Hathaway shane at hathawaymix.org
Wed May 4 22:23:41 CEST 2005


Reinhold Birkenfeld wrote:
> Shane Hathaway wrote:
> 
> 
>>For each block statement, it is necessary to create a *new* iterator,
> 
> 
> Right.
> 
> 
>>since iterators that have stopped are required to stay stopped.  So at a
>>minimum, used-defined statements will need to call something, and thus
>>will have parentheses.  The parentheses might be enough to make block
>>statements not look like built-in keywords.
>>
>>PEP 340 seems to punish people for avoiding the parentheses:
>>
>>    transaction = begin_transaction()
>>
>>    transaction:
>>        db.execute('insert 3 into mytable')
>>
>>    transaction:
>>        db.execute('insert 4 into mytable')
>>
>>I expect that only '3' would be inserted in mytable.  The second use of
>>the transaction iterator will immediately raise StopIteration.
> 
> 
> Yes, but wouldn't you think that people would misunderstand it in this way?

Yes, they might.  Just to be clear, the risk is that people will try to
write statements without parentheses and get burned because their code
doesn't get executed, right?

A possible workaround is to identify iterators that have already
finished.  StopIteration doesn't distinguish between an iterator that
never yields any values from an iterator that has yielded all of its
values.  Maybe there should be a subclass of StopIteration like
"AlreadyStoppedIteration".  Then, if a block statement gets an
AlreadyStoppedIteration exception from its iterator, it should convert
that to an error like "InvalidBlockError".

Shane


More information about the Python-Dev mailing list