From: Ulrich Eckhardt on
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

From: Arnaud Delobelle on


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
From: Peter Otten on
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
From: Peter Otten on
Duncan Booth wrote:

> Peter Otten <__peter__(a)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)

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

From: Ulrich Eckhardt on
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!

Uli

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