class_docstr: Read-only interface from a storage protocol.
  
  .. seealso::
  
      :py:class:`BaseStorageProtocol`
class_docstr_tok: ["Read-only","interface","from","a","storage","protocol",".","..","seealso",":",":",":","py",":","class",":","`","BaseStorageProtocol","`"]
docstr: Get attribute only if valid
docstr_tok: ["Get","attribute","only","if","valid"]
code: def __getattr__(self, attr):
      """Get attribute only if valid"""
      if attr not in self.valid_attributes:
          raise AttributeError(
              "Cannot access attribute %s on ReadOnlyStorageProtocol."
              % attr
          )
  
      return getattr(self._storage, attr)
  
imports: from __future__ import annotations
  import contextlib
  import copy
  import logging
  import typing
  from datetime import datetime
  from typing import Literal
  import orion.core
  from orion.core.io import resolve_config
  from orion.core.utils import GenericFactory
label_desc: Use image node_id 2 for calling the ReadOnlyStorageProtocol obj's underlying member method code with example usage: obj.__getattr__(attr) and returns: getattr