Phillip J. Eby wrote: > At 09:12 PM 4/24/05 -0600, Steven Bethard wrote: > >> I guess it would be helpful to see example where the looping >> with-block is useful. > > > Automatically retry an operation a set number of times before hard failure: > > with auto_retry(times=3): > do_something_that_might_fail() > > Process each row of a database query, skipping and logging those that > cause a processing error: > > with x,y,z = log_errors(db_query()): > do_something(x,y,z) > > You'll notice, by the way, that some of these "runtime macros" may be > stackable in the expression. These are also possible by combining a normal for loop with a non-looping with (but otherwise using Guido's exception injection semantics): def auto_retry(attempts): success = [False] failures = [0] except = [None] def block(): try: yield None except: failures[0] += 1 else: success[0] = True while not success[0] and failures[0] < attempts: yield block() if not success[0]: raise Exception # You'd actually propagate the last inner failure for attempt in auto_retry(3): with attempt: do_something_that_might_fail() The non-looping version of with seems to give the best of both worlds - multipart operation can be handled by multiple with statements, and repeated use of the same suite can be handled by nesting the with block inside iteration over an appropriate generator. Cheers, Nick. -- Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia --------------------------------------------------------------- http://boredomandlaziness.skystorm.net
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4