docs: def split_results(self):
          """
          Convenience method to separate failed and successful results.
  
          .. versionadded:: 2.0.0
  
          This function will split the results of the failed operation
          (see :attr:`.all_results`) into "good" and "bad" dictionaries.
  
          The intent is for the application to handle any successful
          results in a success code path, and handle any failed results
          in a "retry" code path. For example
  
          .. code-block:: python
  
              try:
                  cb.add_multi(docs)
              except CouchbaseTransientError as e:
                  # Temporary failure or server OOM
                  _, fail = e.split_results()
  
                  # Sleep for a bit to reduce the load on the server
                  time.sleep(0.5)
  
                  # Try to add only the failed results again
                  cb.add_multi(fail)
  
          Of course, in the example above, the second retry may fail as
          well, and a more robust implementation is left as an exercise
          to the reader.
  
          :return: A tuple of ( `ok`, `bad` ) dictionaries.
          """
  
          ret_ok, ret_fail = {}, {}
          count = 0
          nokey_prefix = ([""] + sorted(filter(bool, self.all_results.keys())))[-1]
          for key, v in self.all_results.items():
              if not key:
                  key = nokey_prefix + ":nokey:" + str(count)
                  count += 1
              success = getattr(v,'success', True)
              if success:
                  ret_ok[key] = v
              else:
                  ret_fail[key] = v
  
          return ret_ok, ret_fail