code: def handle_interrupt(cancel, f, *a, **kw):
      '''Execute a function f(*a, **kw) listening for KeyboardInterrupt and if
      handled, invoke the cancel function. Blocks until f is complete or the
      interrupt is handled.
      '''
      res = []
  
      def run():
          res.append(f(*a, **kw))
      t = threading.Thread(target=run)
      t.start()
      # poll (or we miss the interrupt) and await completion
      try:
          while t.isAlive():
              t.join(.1)
      except KeyboardInterrupt:
          cancel()
          raise
      return res and res.pop(f handle_interrupt(cancel, f, *a, **kw):
      '''Execute a function f(*a, **kw) listening for KeyboardInterrupt and if
      handled, invoke the cancel function. Blocks until f is complete or the
      interrupt is handled.
      '''
      res = []
  
      def run():
          res.append(f(*a, **kw))
      t = threading.Thread(target=run)
      t.start()
      # poll (or we miss the interrupt) and await completion
      try:
          while t.isAlive():
              t.join(.1)
      except KeyboardInterrupt:
          cancel()
          raise
      return res and res.pop()
docs: Execute a function f(*a, **kw) listening for KeyboardInterrupt and if
      handled, invoke the cancel function. Blocks until f is complete or the
      interrupt is handled.