<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def watch(self, keys, on_watch, filters=None, start_revision=None, return_previous=None):
 """ 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 """

        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