[Tutor] Really miss the C preprocessor!!
Steven D'Aprano
steve at pearwood.info
Sat Mar 6 14:51:30 CET 2010
On Sat, 6 Mar 2010 07:17:43 pm you wrote:
> I thought about suggesting using decorators for this, since I've done
> something similar (not exactly exponential backoff, but retrying a
> few times on exception). However, as I started writing the example, I
> got stuck at expressing a generic way to pass the exception and
> numretries. I was just wondering is there some way to do this sort of
> thing with decorators ??
[...]
> is there a way to decorate a function alongwith additional parameters
> which will be passed to the function ?
Yes, you need a decorator factory -- a function which returns a
decorator.
def factory(exception, numretries):
def decorator(func):
@functools.wraps(func)
def inner(*args, **kwargs):
t = 1
for i in range(numretries):
try:
return func(*args, **kwargs)
except exception:
time.sleep(t)
t *= 2
msg = "no connection after %d attempts" % numretries
raise exception(msg)
return inner
return decorator
@factory(HTTPError, 8)
def check_some_website(url, x):
...
I haven't tested the above code, but it should do the trick.
--
Steven D'Aprano
More information about the Tutor
mailing list