[Python-ideas] Retrying EAFP without DRY

Nick Coghlan ncoghlan at gmail.com
Tue Jan 24 15:06:23 CET 2012


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

You can also design smarter versions where the object yielded is
mutable, making it easy to pass state back into the iterator.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia



More information about the Python-ideas mailing list