[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