[Python-ideas] BUG in standard while statement

Joseph Jevnik joejev at gmail.com
Wed Sep 9 19:15:04 CEST 2015


This appears as intended. The body of the while condition is executed each
time the condition is checked. In the first case, you are creating a single
instance of repeat, and then calling bool on the expression with each
iteration of the loop. With the second case, you are constructing a _new_
repeat instance each time. Think about the difference between:

while should_stop():
    ...

and:
a = should_stop()
while a:
    ...

One would expect should_stop to be called each time in the first case; but,
in the second case it is only called once.

With all that said, I think you want to use the __iter__ and __next__
protocols to implement this in a more supported way.

On Wed, Sep 9, 2015 at 1:10 PM, Stephan Sahm <Stephan.Sahm at gmx.de> wrote:

> Dear all
>
> I found a BUG in the standard while statement, which appears both in
> python 2.7 and python 3.4 on my system.
>
> It usually won't appear because I only stumbled upon it after trying to
> implement a nice repeat structure. Look:
> ​```​
> class repeat(object):
>     def __init__(self, n):
>         self.n = n
>
>     def __bool__(self):
>         self.n -= 1
>         return self.n >= 0
>
>     __nonzero__=__bool__
>
> a = repeat(2)
> ```
> the meaning of the above is that bool(a) returns True 2-times, and after
> that always False.
>
> Now executing
> ```
> while a:
>     print('foo')
> ```
> will in fact print 'foo' two times. HOWEVER ;-) ....
> ```
> while repeat(2):
>     print('foo')
> ```
> will go on and go on, printing 'foo' until I kill it.
>
> Please comment, explain or recommend this further if you also think that
> both while statements should behave identically.
>
> hoping for responses,
> best,
> Stephan
>
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20150909/a7337a10/attachment.html>


More information about the Python-ideas mailing list