code: def _read_wrappers(self, name):
          
          io_attr = getattr(self._io, name)
  
          def read_wrapper(*args, **kwargs):
              """Wrap all read calls to the stream object.
  
              We do this to track the read pointer separate from the write
              pointer.  Anything that wants to read from the stream object
              while we're in append mode goes through this.
  
              Args:
                  *args: pass through args
                  **kwargs: pass through kwargs
              Returns:
                  Wrapped stream object method
              """
              self._io.seek(self._read_seek, self._read_whence)
              ret_value = io_attr(*args, **kwargs)
              self._read_seek = self._io.tell()
              self._read_whence = 0
              self._io.seek(0, 2)
              return ret_value
  
          return read_wrapper
docs: Wrap a stream attribute in a read wrapper.
  
          Returns a read_wrapper which tracks our own read pointer since the
          stream object has no concept of a different read and write pointer.
  
          Args:
              name: The name of the attribute to wrap. Should be a read call.
  
          Returns:
              The read_wrapper function.