class_docstr: An abstract base class to access features from a remote feature store.
  
  Args:
      tensor_attr_cls (TensorAttr, optional): A user-defined
          :class:`TensorAttr` class to customize the required attributes and
          their ordering to unique identify tensor values.
          (default: :obj:`None`)
class_docstr_tok: ["An","abstract","base","class","to","access","features","from","a","remote","feature","store",".","Args",":","tensor_attr_cls","(","TensorAttr",",","optional",")",":","A","user-defined",":","class",":","`","TensorAttr","`","class","to","customize","the","required","attributes","and","their","ordering","to","unique","identify","tensor","values",".","(","default",":",":","obj",":","`","None","`",")"]
docstr: Synchronously obtains a list of tensors from the
  :class:`FeatureStore` for each tensor associated with the attributes in
  :obj:`attrs`.
  
  .. note::
      The default implementation simply iterates over all calls to
      :meth:`get_tensor`. Implementor classes that can provide
      additional, more performant functionality are recommended to
      to override this method.
  
  Args:
      attrs (List[TensorAttr]): A list of input :class:`TensorAttr`
          objects that identify the tensors to obtain.
      convert_type (bool, optional): Whether to convert the type of the
          output tensor to the type of the attribute index.
          (default: :obj:`False`)
  
  Raises:
      ValueError: If any input :class:`TensorAttr` is not fully
          specified.
      KeyError: If any of the tensors corresponding to the input
          :class:`TensorAttr` was not found.
docstr_tok: ["Synchronously","obtains","a","list","of","tensors","from","the",":","class",":","`","FeatureStore","`","for","each","tensor","associated","with","the","attributes","in",":","obj",":","`","attrs","`",".","..","note",":",":","The","default","implementation","simply","iterates","over","all","calls","to",":","meth",":","`","get_tensor","`",".","Implementor","classes","that","can","provide","additional",",","more","performant","functionality","are","recommended","to","to","override","this","method",".","Args",":","attrs","(","List","[","TensorAttr","]",")",":","A","list","of","input",":","class",":","`","TensorAttr","`","objects","that","identify","the","tensors","to","obtain",".","convert_type","(","bool",",","optional",")",":","Whether","to","convert","the","type","of","the","output","tensor","to","the","type","of","the","attribute","index",".","(","default",":",":","obj",":","`","False","`",")","Raises",":","ValueError",":","If","any","input",":","class",":","`","TensorAttr","`","is","not","fully","specified",".","KeyError",":","If","any","of","the","tensors","corresponding","to","the","input",":","class",":","`","TensorAttr","`","was","not","found","."]
code: def multi_get_tensor(
      self,
      attrs: List[TensorAttr],
      convert_type: bool = False,
  ) -> List[FeatureTensorType]:
      r"""Synchronously obtains a list of tensors from the
      :class:`FeatureStore` for each tensor associated with the attributes in
      :obj:`attrs`.
  
      .. note::
          The default implementation simply iterates over all calls to
          :meth:`get_tensor`. Implementor classes that can provide
          additional, more performant functionality are recommended to
          to override this method.
  
      Args:
          attrs (List[TensorAttr]): A list of input :class:`TensorAttr`
              objects that identify the tensors to obtain.
          convert_type (bool, optional): Whether to convert the type of the
              output tensor to the type of the attribute index.
              (default: :obj:`False`)
  
      Raises:
          ValueError: If any input :class:`TensorAttr` is not fully
              specified.
          KeyError: If any of the tensors corresponding to the input
              :class:`TensorAttr` was not found.
      """
      attrs = [self._tensor_attr_cls.cast(attr) for attr in attrs]
      bad_attrs = [
          attr for attr in attrs if not attr.is_fully_specified()
      ]
      if len(bad_attrs) > 0:
          raise ValueError(
              f"The input TensorAttr(s) '{bad_attrs}' are not fully "
              f"specified. Please fully-specify them by specifying all "
              f"'UNSET' fields"
          )
  
      tensors = self._multi_get_tensor(attrs)
      if any(v is None for v in tensors):
          bad_attrs = [
              attrs[i] for i, v in enumerate(tensors) if v is None
          ]
          raise KeyError(
              f"Tensors corresponding to attributes "
              f"'{bad_attrs}' were not found"
          )
  
      return [
          self._to_type(attr, tensor) if convert_type else tensor
          for attr, tensor in zip(attrs, tensors)
      ]
  
imports: import copy
  from abc import abstractmethod
  from dataclasses import dataclass
  from enum import Enum
  from typing import Any, List, Optional, Tuple, Union
  import numpy
  import torch
  from torch_geometric.typing import FeatureTensorType, NodeType
  from torch_geometric.utils.mixin import CastMixin
label_desc: Use image node_id 7 for calling the FeatureStore obj's underlying member method code with example usage: obj.multi_get_tensor(attrs, convert_type) and returns: unknown