[Python-ideas] Retrying EAFP without DRY
Chris Rebert
pyideas at rebertia.com
Tue Jan 24 19:01:42 CET 2012
More information about the Python-ideas mailing list
Tue Jan 24 19:01:42 CET 2012
- Previous message: [Python-ideas] Retrying EAFP without DRY
- Next message: [Python-ideas] Retrying EAFP without DRY
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
> On 24 Jan 2012, at 14:06, Nick Coghlan <ncoghlan at gmail.com> wrote: >> On Tue, Jan 24, 2012 at 9:36 PM, Paul Moore <p.f.moore at gmail.com> wrote: >>> A construct that let end users abstract this type of pattern would >>> probably be a far bigger win than a retry statement. (And it may be >>> that it has the benefit of already existing, I just couldn't see it >>> :-)) >> >> You just need to move the pause inside the iterator: >> >> def backoff(attempts, first_delay, scale=2): >> delay = first_delay >> for attempt in range(1, attempts+1): >> yield attempt >> time.sleep(delay) >> delay *= 2 >> >> for __ in backoff(MAX_ATTEMPTS, 5): >> try: >> response = urllib2.urlopen(url) >> except urllib2.HTTPError as e: >> if e.code == 503: # Service Unavailable. >> continue >> raise >> break On Tue, Jan 24, 2012 at 7:21 AM, Jakob Bowyer <jkbbwr at gmail.com> wrote: > Would this not be better expressed as a context manager? > > with backoff(maxattempts, 5): > # do stuff It can't be. The `with` statement always executes its block exactly once; the context manager(s) have no say in the matter (unless perhaps you count raising an exception prior to the block's execution). Cheers, Chris
- Previous message: [Python-ideas] Retrying EAFP without DRY
- Next message: [Python-ideas] Retrying EAFP without DRY
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-ideas mailing list