Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

while loop with the condition used in the body

0 views
Skip to first unread message

Ulrich Eckhardt

unread,
Feb 24, 2010, 4:15:17 AM2/24/10
to
Hi!

I'm looking for a way to write code similar to this C code:

while(rq = get_request(..)) {
handle_request(rq);
}

Currently I'm doing

while True:
rq = get_request(...)
if not rq:
break
handle_request(rq)

in Python 2.6. Any suggestions how to rewrite that?

Uli

--
Sator Laser GmbH
Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932

Arnaud Delobelle

unread,
Feb 24, 2010, 5:07:00 AM2/24/10
to

Ulrich Eckhardt wrote:
> Hi!
>
> I'm looking for a way to write code similar to this C code:
>
> while(rq = get_request(..)) {
> handle_request(rq);
> }
>
> Currently I'm doing
>
> while True:
> rq = get_request(...)
> if not rq:
> break
> handle_request(rq)
>
> in Python 2.6. Any suggestions how to rewrite that?
>

This is the common idiom.

--
Arnaud

Peter Otten

unread,
Feb 24, 2010, 5:21:36 AM2/24/10
to
Ulrich Eckhardt wrote:

> I'm looking for a way to write code similar to this C code:
>
> while(rq = get_request(..)) {
> handle_request(rq);
> }
>
> Currently I'm doing
>
> while True:
> rq = get_request(...)
> if not rq:
> break
> handle_request(rq)
>
> in Python 2.6. Any suggestions how to rewrite that?

Assuming get_request(...) is called with the same arguments on each
iteration and uses None to signal that there is no more data:

from functools import partial

for rq in iter(partial(get_request, ...), None):
handle_request(rq)

Peter

Duncan Booth

unread,
Feb 24, 2010, 5:31:48 AM2/24/10
to
Peter Otten <__pet...@web.de> wrote:

> Ulrich Eckhardt wrote:
>
>> I'm looking for a way to write code similar to this C code:
>>
>> while(rq = get_request(..)) {
>> handle_request(rq);
>> }
>>

> Assuming get_request(...) is called with the same arguments on each
> iteration and uses None to signal that there is no more data:
>
> from functools import partial
>
> for rq in iter(partial(get_request, ...), None):
> handle_request(rq)
>
> Peter

and the next step on from this is to realise that the problem isn't how to
code the calls to get_request(), the problem is actually that get_request()
itself isn'ty Pythonic. Rewrite it as a generator, rename it to reflect
that it now generates a sequence of requests and the code becomes:

for rq in incoming_requests(...):
handle_request(rq)


--
Duncan Booth http://kupuguy.blogspot.com

Peter Otten

unread,
Feb 24, 2010, 5:38:33 AM2/24/10
to
Duncan Booth wrote:

...and a likely implementation would be

def incoming_requests(...):
while True:
rq = ... # inlined version of get_request()
if not rq:
break
yield rq

In other words: It's turtles all the way down...

Peter

Ulrich Eckhardt

unread,
Feb 24, 2010, 6:24:58 AM2/24/10
to
Peter Otten wrote:

> Duncan Booth wrote:
>> for rq in incoming_requests(...):
>> handle_request(rq)
>
> ...and a likely implementation would be
>
> def incoming_requests(...):
> while True:
> rq = ... # inlined version of get_request()
> if not rq:
> break
> yield rq
>
> In other words: It's turtles all the way down...

Almost. While it moves the ugliness, at least it allows separating the
iteration logic from the handling logic, which is already a big step ahead!

That said, there is:

with <expression> as <name>:
...

so why not:

while <expression> as <name>:
...

and also:

if <expression> as <name>:
...


Thanks to everybody for their input!

Gregory Ewing

unread,
Feb 25, 2010, 2:46:41 AM2/25/10
to
Ulrich Eckhardt wrote:

> so why not:
>
> while <expression> as <name>:
> ...
>
> and also:
>
> if <expression> as <name>:
> ...

This sort of thing has been suggested repeatedly in the
past, and it's always been rejected. That's not likely to
change. Look up the past threads for the reasons why.

--
Greg

0 new messages