[Python-ideas] A suggestion for a do...while loop

Nick Coghlan ncoghlan at gmail.com
Mon Jun 26 00:41:03 EDT 2017


On 26 June 2017 at 10:25, Rob Cliffe <rob.cliffe at btinternet.com> wrote:
>
>
> On 25/06/2017 12:58, Markus Meskanen wrote:
>>
>> I'm a huge fan of the do...while loop in other languages, and it would
>> often be useful in Python too, when doing stuff like:
>>
>> while True:
>>     password = input()
>>     if password == ...:
>>         break
>>
>> [...]I suggest [...]
>>
>> do:
>>     password = input('Password: ')
>>     until password == secret_password
>>
>>     # This line only gets printed if until failed
>>     print('Invalid password, try again!')
>>
>>
> I don't see any significant advantage in providing an extra Way To Do It.
> Granted, the "while True" idiom is an idiosyncrasy, but it is frequently
> used and IMHO intuitive and easy to get used to.  Your suggestion doesn't
> even save a line of code, given that you can write:
>
>     while True:
>         password = input('Password:')
>         if password == secret_password: break
>         print('Invalid password, try again!')

Right, this is the key challenge for do-while loops in Python: can you
come up with something that's significantly clearer than the current
"while True/if/break" pattern?

The biggest weakness of that idiom is that it isn't really explicit in
the header line - there's nothing about "while True:" that directly
tells the reader "This loop is expected to exit via a break
statement".

If we wanted to allow that to be expressed literally, we could
probably special case the "while not break" keyword sequence as a do
loop:

    while not break:
        # Setup
        if condition: break
        # Loop continuation

That more explicit declaration of intent ("The code in the loop body
will conditionally break out of this loop") would allow a couple of
things:

- the compiler could warn that an else clause attached to such a loop
will never execute (technically it could do that for any expression
that resolves to `True` as a constant)
- code linters could check the loop body for a break statement and
complain if they didn't see one

Logically, it's exactly the same as writing "while True:", but whereas
that spelling suggests "infinite loop", the "while not break:"
spelling would more directly suggest "terminated inside the loop body
via a break statement"

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia


More information about the Python-ideas mailing list