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