[Python-Dev] Re: anonymous blocks
Nick Coghlan
ncoghlan at gmail.com
Tue Apr 26 23:21:06 CEST 2005
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
More information about the Python-Dev
mailing list