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@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@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/