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

Terry Reedy tjreedy at udel.edu
Mon Jun 26 02:08:11 EDT 2017


On 6/26/2017 12:41 AM, Nick Coghlan wrote:
> 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

We would then also need 'while not return:'

> 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"




-- 
Terry Jan Reedy



More information about the Python-ideas mailing list