def retry(*dargs, **dkw):
    """Wrap a function with a new `Retrying` object.

    :param dargs: positional arguments passed to Retrying object
    :param dkw: keyword arguments passed to the Retrying object
    """
    # support both @retry and @retry() as valid syntax
    if len(dargs) == 1 and callable(dargs[0]):
        return retry()(dargs[0])
    else:
        def wrap(f):
            if asyncio and asyncio.iscoroutinefunction(f):
                r = AsyncRetrying(*dargs, **dkw)
            elif tornado and hasattr(tornado.gen, 'is_coroutine_function') \
                    and tornado.gen.is_coroutine_function(f):
                r = TornadoRetrying(*dargs, **dkw)
            else:
                r = Retrying(*dargs, **dkw)

            return r.wraps(f)

        return wrap
def retry ( * dargs , ** dkw ) : if len ( dargs ) == 1 and callable ( dargs [ 0 ] ) : return retry ( ) ( dargs [ 0 ] ) else : def wrap ( f ) : if asyncio and asyncio . iscoroutinefunction ( f ) : r = AsyncRetrying ( * dargs , ** dkw ) elif tornado and hasattr ( tornado . gen , 'is_coroutine_function' ) and tornado . gen . is_coroutine_function ( f ) : r = TornadoRetrying ( * dargs , ** dkw ) else : r = Retrying ( * dargs , ** dkw ) return r . wraps ( f ) return wrap
Wrap a function with a new `Retrying` object.

    :param dargs: positional arguments passed to Retrying object
    :param dkw: keyword arguments passed to the Retrying object