class_docstr: A feature fetcher used to fetch features for node/edge in graphbolt.
  
  Functional name: :obj:`fetch_feature`.
  
  Parameters
  ----------
  datapipe : DataPipe
      The datapipe.
  feature_store : FeatureStore
      A storage for features, support read and update.
  node_feature_keys : List[str] or Dict[str, List[str]]
      Node features keys indicates the node features need to be read.
      - If `node_features` is a list: It means the graph is homogeneous
      graph, and the 'str' inside are feature names.
      - If `node_features` is a dictionary: The keys should be node type
      and the values are lists of feature names.
  edge_feature_keys : List[str] or Dict[str, List[str]]
      Edge features name indicates the edge features need to be read.
      - If `edge_features` is a list: It means the graph is homogeneous
      graph, and the 'str' inside are feature names.
      - If `edge_features` is a dictionary: The keys are edge types,
      following the format 'str:str:str', and the values are lists of
      feature names.
code: def __init__(
      self,
      datapipe,
      feature_store,
      node_feature_keys=None,
      edge_feature_keys=None,
  ):
      super().__init__(datapipe, self._read)
      self.feature_store = feature_store
      self.node_feature_keys = node_feature_keys
      self.edge_feature_keys = edge_feature_keys
  
file_path: dgl/python/dgl/graphbolt/feature_fetcher.py
imports: from typing import Dict
  from torch.utils.data import functional_datapipe
  from .base import etype_tuple_to_str
  from .minibatch_transformer import MiniBatchTransformer
label_desc: Use image node_id 1 to create a new FeatureFetcher object from inherited base classes: MiniBatchTransformer with example: obj = FeatureFetcher(datapipe, feature_store, node_feature_keys, edge_feature_keys)