class_docstr: A DataStoreStorage defines the interface of communication between the
  higher-level datastores and the actual storage system.
  
  Both the ContentAddressedStore and the TaskDataStore use these methods to
  read/write/list from the actual storage system. These methods are meant to
  be low-level; they are in a class to provide better abstraction but this
  class itself is not meant to be initialized.
docstr: Creates objects and stores them in the datastore.
  
  If overwrite is False, any existing object will not be overwritten and
  an error will be returned.
  
  The objects are specified in an iterator over (path, obj) tuples where
  the path is the path to store the object and the value is a file-like
  object from which bytes can be read.
  
  Parameters
  ----------
  path_and_bytes_iter : Iterator[(string, (RawIOBase|BufferedIOBase, metadata))]
      Iterator over objects to store; the first element in the outermost
      tuple is the path to store the bytes at. The second element in the
      outermost tuple is either a RawIOBase or BufferedIOBase or a tuple
      where the first element is a RawIOBase or BufferedIOBase and the
      second element is a dictionary of metadata to associate with the
      object.
      Keys for the metadata must be ascii only string and elements
      can be anything that can be converted to a string using json.dumps.
      If you have no metadata, you can simply pass a RawIOBase or
      BufferedIOBase.
  overwrite : bool
      True if the objects can be overwritten. Defaults to False.
      Even when False, it is NOT an error condition to see an existing object.
      Simply do not perform the upload operation.
  len_hint : int
      Estimated number of items produced by the iterator
  
  Returns
  -------
  None
docstr_tok: ["Creates","objects","and","stores","them","in","the","datastore",".","If","overwrite","is","False",",","any","existing","object","will","not","be","overwritten","and","an","error","will","be","returned",".","The","objects","are","specified","in","an","iterator","over","(","path",",","obj",")","tuples","where","the","path","is","the","path","to","store","the","object","and","the","value","is","a","file-like","object","from","which","bytes","can","be","read",".","Parameters","--","--","--","--","--","path_and_bytes_iter",":","Iterator","[","(","string",",","(","RawIOBase|BufferedIOBase",",","metadata",")",")","]","Iterator","over","objects","to","store",";","the","first","element","in","the","outermost","tuple","is","the","path","to","store","the","bytes","at",".","The","second","element","in","the","outermost","tuple","is","either","a","RawIOBase","or","BufferedIOBase","or","a","tuple","where","the","first","element","is","a","RawIOBase","or","BufferedIOBase","and","the","second","element","is","a","dictionary","of","metadata","to","associate","with","the","object",".","Keys","for","the","metadata","must","be","ascii","only","string","and","elements","can","be","anything","that","can","be","converted","to","a","string","using","json.dumps",".","If","you","have","no","metadata",",","you","can","simply","pass","a","RawIOBase","or","BufferedIOBase",".","overwrite",":","bool","True","if","the","objects","can","be","overwritten",".","Defaults","to","False",".","Even","when","False",",","it","is","NOT","an","error","condition","to","see","an","existing","object",".","Simply","do","not","perform","the","upload","operation",".","len_hint",":","int","Estimated","number","of","items","produced","by","the","iterator","Returns","--","--","--","-","None"]
code: def save_bytes(
      self, path_and_bytes_iter, overwrite=False, len_hint=0
  ):
      """
      Creates objects and stores them in the datastore.
  
      If overwrite is False, any existing object will not be overwritten and
      an error will be returned.
  
      The objects are specified in an iterator over (path, obj) tuples where
      the path is the path to store the object and the value is a file-like
      object from which bytes can be read.
  
      Parameters
      ----------
      path_and_bytes_iter : Iterator[(string, (RawIOBase|BufferedIOBase, metadata))]
          Iterator over objects to store; the first element in the outermost
          tuple is the path to store the bytes at. The second element in the
          outermost tuple is either a RawIOBase or BufferedIOBase or a tuple
          where the first element is a RawIOBase or BufferedIOBase and the
          second element is a dictionary of metadata to associate with the
          object.
          Keys for the metadata must be ascii only string and elements
          can be anything that can be converted to a string using json.dumps.
          If you have no metadata, you can simply pass a RawIOBase or
          BufferedIOBase.
      overwrite : bool
          True if the objects can be overwritten. Defaults to False.
          Even when False, it is NOT an error condition to see an existing object.
          Simply do not perform the upload operation.
      len_hint : int
          Estimated number of items produced by the iterator
  
      Returns
      -------
      None
      """
      raise NotImplementedError
  
imports: from collections import namedtuple
  import re
  from .exceptions import DataException
label_desc: Use image node_id 13 for calling the DataStoreStorage obj's underlying member method code with example usage: obj.save_bytes(path_and_bytes_iter, overwrite, len_hint) without return types