[Python-Dev] PEP 340 keyword: Extended while syntax

Ron Adam rrr at ronadam.com
Thu May 5 21:05:28 CEST 2005


Gustavo Niemeyer wrote:
> Greetings,
> 
> 
>>Reasoning: The block statement resembles a "while" block in some ways in 
>>that it is a conditional block that may be executed only once, or 
>>possibly not at all (or many times).  And the word "while" is also 
>>descriptive of how a block is used.
>>
>>     while VAR1 from EXPR1():
>>         BLOCK
> 
> 
> This is an interesting propose, but for a different PEP.  

Maybe someone who is more familiar with submitting a PEP could submit it 
as a competing PEP to 340 then.

In the
> current propose VAR1 is not evaluated for truthness, and many of
> the usage examples doesn't even require it.

VAR1 isn't evaluated for truthfulness, but the expression as a whole is. 
  It just says, EXPR1 is a iterator, and VAR1 received a value from it. 
Evaluating to a bool makes it consistent with the 'while' statement 
usage and those checks are all-ready taking place in the block 
statement. Here they are explicit instead of implicit which adds to the 
readability. IMHO of course.

> This looks quite strange, for instance:
> 
>    while dummy from locking(myLock):
>       # Do something

I thought of that, but I could get use to it.  The dummy helps make it 
readable although the value may not actually be used in the block.  One 
use with locks is to return a count of the current locks.  Useful for 
monitoring what the iterator is doing.

A shorter "while locking(myLock):" could be used, and the "dummy from" 
be optional.  In that case the returned None would be discarded.

	while [NAME from] ITERATOR():

Or it could be made explicit with:

	while None == locking(myLock):

Although I suppose this would look strange to some also. In this case, 
an explicit test is being made of the returned VAR1.  Testing for other 
values could be possible.


> And also, this would require a break necessarily:
> 
>    while (foo, bar) from locking():
>       # Pass

If the iterator is written without a loop in it, it will only execute 
one yield, so the second time though it will end without returning a 
value.

def locking():
    try:
        yield lock()
    finally:
        release lock()

This will execute once in an extended while.

def locking():
    try:
        while True:
           yield new_lock()
    finally:
        release_all_locks()

This would need to be broken out of.

>>This will require a new keyword/operator 'from' to use in a 'from' 
>>expression:
> 
> 
> 'from' is already a keyword, btw.

Oh, um... need more sleep. ;-)

So no new keywords would be needed in this example, just an alternate 
use of an existing keyword.  Replace the above with...

 >>This will require *no* new keyword, the keyword/operator 'from' will 
have a new use in an extended while expression:

Since I tend to put imports at the top of my programs and never see 
'from' anywhere else, it didn't ring a bell.

Any reason why they both couldn't work?


Cheers, Ron_Adam




More information about the Python-Dev mailing list