seeking deeper (language theory) reason behind Python design choice

Ian Kelly ian.g.kelly at gmail.com
Fri May 11 09:28:27 EDT 2018


On Fri, May 11, 2018 at 1:06 AM, Chris Angelico <rosuav at gmail.com> wrote:
> On Fri, May 11, 2018 at 4:54 PM, Ian Kelly <ian.g.kelly at gmail.com> wrote:
>> On Thu, May 10, 2018 at 11:45 PM, Steven D'Aprano
>> <steve+comp.lang.python at pearwood.info> wrote:
>>> To be honest, I'm having trouble thinking of a good use-case for "while
>>> True", now that we have infinite iterators. Most cases of
>>>
>>>     while True:
>>>         x = get_item()
>>>         if not x: break
>>>         process(x)
>>>
>>> are better written as:
>>>
>>>     for x in iterator:
>>>         process(x)
>>
>> x = get_item()
>> while True:
>>     x = process(x)
>
> More likely:
>
> x = get_item()
> while x:
>     process(x)
>     x = get_item()
>
> which (a) repeats the call to get_item, (b) doesn't support the
> 'continue' statement, and (c) hides crucial loop iteration information
> at the BOTTOM of the loop.
>
> But to make this iterator, you need to separate the while loop's
> header from its body. Compare:
>
> while x := get_item():
>     process(x)
>
>
> def get_items():
>     while True:
>         x = get_item()
>         if not x: return
>         yield x
>
> for x in get_items():
>     process(x)
>
> It hasn't actually gotten rid of the fib of the infinite loop; all
> it's done is wrap it up in a function. Yes, that can be of value; but
> adding another level of indirection doesn't solve a problem, it just
> moves it around.

You can get rid of the while loop:

for x in iter(get_item, None):
    process(x)

The reason I suggested the function I did is because the x in that
case can't reasonably be turned into an iterator because the logic
depends on the loop body. You can't encapsulate the iteration logic
without having side-effects in the iteration or duplicating code.



More information about the Python-list mailing list