code: def test_pull_multi_fallback(idtype):
      # create a graph with zero in degree nodes
      g = dgl.graph([])
      g = g.astype(idtype).to(F.ctx())
      g.add_nodes(10)
      for i in range(1, 9):
          g.add_edges(0, i)
          g.add_edges(i, 9)
      g.ndata["h"] = F.randn((10, D))
      g.edata["w1"] = F.randn((16,))
      g.edata["w2"] = F.randn((16, D))
  
      def _mfunc_hxw1(edges):
          return {
              "m1": edges.src["h"] * F.unsqueeze(edges.data["w1"], 1)
          }
  
      def _mfunc_hxw2(edges):
          return {"m2": edges.src["h"] * edges.data["w2"]}
  
      def _rfunc_m1(nodes):
          return {"o1": F.sum(nodes.mailbox["m1"], 1)}
  
      def _rfunc_m2(nodes):
          return {"o2": F.sum(nodes.mailbox["m2"], 1)}
  
      def _rfunc_m1max(nodes):
          return {"o3": F.max(nodes.mailbox["m1"], 1)}
  
      def _afunc(nodes):
          ret = {}
          for k, v in nodes.data.items():
              if k.startswith("o"):
                  ret[k] = 2 * v
          return ret
  
      # nodes to pull
      def _pull_nodes(nodes):
          # compute ground truth
          g.pull(nodes, _mfunc_hxw1, _rfunc_m1, _afunc)
          o1 = g.ndata.pop("o1")
          g.pull(nodes, _mfunc_hxw2, _rfunc_m2, _afunc)
          o2 = g.ndata.pop("o2")
          g.pull(nodes, _mfunc_hxw1, _rfunc_m1max, _afunc)
          o3 = g.ndata.pop("o3")
          # v2v spmv
          g.pull(
              nodes,
              fn.u_mul_e("h", "w1", "m1"),
              fn.sum(msg="m1", out="o1"),
              _afunc,
          )
          assert F.allclose(o1, g.ndata.pop("o1"))
          # v2v fallback to e2v
          g.pull(
              nodes,
              fn.u_mul_e("h", "w2", "m2"),
              fn.sum(msg="m2", out="o2"),
              _afunc,
          )
          assert F.allclose(o2, g.ndata.pop("o2"))
  
      # test#1: non-0deg nodes
      nodes = [1, 2, 9]
      _pull_nodes(nodes)
      # test#2: 0deg nodes + non-0deg nodes
      nodes = [0, 1, 2, 9]
      _pull_nodes(nodes)
  
file_path: dgl/tests/python/common/test_heterograph-specialization.py
imports: import backend
  import dgl
  import dgl.function
  import numpy
  import scipy.sparse
  from utils import parametrize_idtype
label_desc: Use image node_id 6 for calling a global function with example usage: test_pull_multi_fallback(idtype) and returns: dict, dict, dict, dict, dict, ret