code: def etype_tuple_to_str(c_etype):
      """Convert canonical etype from tuple to string.
  
      Examples
      --------
      >>> c_etype = ("user", "like", "item")
      >>> c_etype_str = _etype_tuple_to_str(c_etype)
      >>> print(c_etype_str)
      "user:like:item"
      """
      assert isinstance(c_etype, tuple) and len(c_etype) == 3, (
          "Passed-in canonical etype should be in format of (str, str, str). "
          f"But got {c_etype}."
      )
      return CANONICAL_ETYPE_DELIMITER.join(c_etype)
  
file_path: dgl/python/dgl/graphbolt/base.py
imports: from dataclasses import dataclass
  import torch
  from torch.utils.data import functional_datapipe
  from torchdata.datapipes.iter import IterDataPipe
  from ..utils import recursive_apply
label_desc: Use image node_id 3 for calling a global function with example usage: etype_tuple_to_str(c_etype) and returns: CANONICAL_ETYPE_DELIMITER