code: def transaction(self, func, *watches, **kwargs):
          
          with self.pipeline(True, share_in_threads=kwargs.get('share_in_threads', False)) as pipe:
              while 1:
                  try:
                      if watches:
                          pipe.watch(*watches)
                      func(pipe)
                      return pipe.execute()
                  except WatchError:
                      continue
docs: Convenience method for executing the callable `func` as a transaction
          while watching all keys specified in `watches`. The 'func' callable
          should expect a single arguement which is a Pipeline object.