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 _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com