Prev: Why One Should Go for Online Tech Support
Next: WANTED: Regular expressions for breaking TeX/LaTeX document intotokens
From: Ulrich Eckhardt on 24 Feb 2010 04:15 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 24 Feb 2010 05:07 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 24 Feb 2010 05:21 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 24 Feb 2010 05:38 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 24 Feb 2010 06:24
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 |