code: def timeout(coro, timeout=None, loop=None):
      
      @asyncio.coroutine
      def _timeout(coro):
          return (yield from asyncio.wait_for(coro, timeout, loop=loop))
  
      @asyncio.coroutine
      def wrapper(*args, **kw):
          return (yield from _timeout(coro(*args, **kw)))
  
      return _timeout(coro) if asyncio.iscoroutine(coro) else wrapper
docs: Wraps a given coroutine function, that when executed, if it takes more
      than the given timeout in seconds to execute, it will be canceled and
      raise an `asyncio.TimeoutError`.
  
      This function is equivalent to Python standard
      `asyncio.wait_for()` function.
  
      This function can be used as decorator.
  
      Arguments:
          coro (coroutinefunction|coroutine): coroutine to wrap.
          timeout (int|float): max wait timeout in seconds.
          loop (asyncio.BaseEventLoop): optional event loop to use.
  
      Raises:
          TypeError: if coro argument is not a coroutine function.
  
      Returns:
          coroutinefunction: wrapper coroutine function.
  
      Usage::
  
          await paco.timeout(coro, timeout=10)