code: def get_edge_data(
      self, u: NodeKey, v: NodeKey, default: EdgeValue | None = None
  ) -> dict[AttrKey, EdgeValue]:
      if self.key_to_id is not None:
          try:
              u = self.key_to_id[u]
              v = self.key_to_id[v]
          except KeyError:
              return default
      else:
          try:
              if u < 0 or v < 0 or u >= self._N or v >= self._N:
                  return default
          except TypeError:
              return default
      index = cp.nonzero(
          (self.src_indices == u) & (self.dst_indices == v)
      )[0]
      if index.size == 0:
          return default
      [index] = index.tolist()
      if not self.edge_values:
          return {}
      return {
          key: val[index].tolist()
          for key, val in self.edge_values.items()
          if key not in self.edge_masks or self.edge_masks[key][index]
      }
  
imports: from __future__ import annotations
  import operator
  from copy import deepcopy
  from typing import TYPE_CHECKING
  import cupy
  import networkx
  import numpy
  import pylibcugraph
  import nx_cugraph
  from ..utils import index_dtype
label_desc: Use image node_id 22 for calling the Graph obj's underlying member method code with example usage: obj.get_edge_data(u, v, default) and returns: unknown, default, dict, default, default, default