code: def watch(self, keys, on_watch, filters=None, start_revision=None, return_previous=None):
          
          d = self._start_watching(keys, on_watch, filters, start_revision, return_previous)
  
          #
          #   ODD: Trying to use a parameter instead of *args errors out as soon as the
          #        parameter is accessed.
          #
          def on_err(*args):
              if args[0].type not in [CancelledError, ResponseFailed]:
                  self.log.warn('etcd watch terminated with "{error}"', error=args[0].type)
                  return args[0]
  
          d.addErrback(on_err)
          return d
docs: Watch one or more keys or key sets and invoke a callback.
  
          Watch watches for events happening or that have happened. The entire event history
          can be watched starting from the last compaction revision.
  
          :param keys: Watch these keys / key sets.
          :type keys: list of bytes or list of instance of :class:`txaioetcd.KeySet`
  
          :param on_watch: The callback to invoke upon receiving
              a watch event.
          :type on_watch: callable
  
          :param filters: Any filters to apply.
  
          :param start_revision: start_revision is an optional
              revision to watch from (inclusive). No start_revision is "now".
          :type start_revision: int
  
          :param return_previous: Flag to request returning previous values.
  
          :returns: A deferred that just fires when watching has started successfully,
              or which fires with an error in case the watching could not be started.
          :rtype: twisted.internet.Deferred