code: def retry(*dargs, **dkw):
      
      # 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
docs: 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