class_docstr: DistGraphTest
      
code: def test_node_feat(self):
      nfeat = self.c1.get_node_feat(
          nodes=[98, 7], node_type="u", feat_names="a"
      )
  
      g_nfeat = [0.21, 0.24]
      for n, g in zip(nfeat[0], g_nfeat):
          self.assertAlmostEqual(n, g)
  
      nodes = [98, 7, 333, 247]
      feat_names = ["a", "b"]
      u_nfeat = self.c1.get_node_feat(
          nodes=nodes, node_type="u", feat_names=feat_names
      )
  
      t_nfeat = self.c1.get_node_feat(
          nodes=nodes, node_type="t", feat_names=feat_names
      )
      #  print(nodes)
      #  print(u_nfeat)
      #  print(t_nfeat)
  
      res = []
      for nfeat1, nfeat2 in zip(u_nfeat, t_nfeat):
          nfeat_list = []
          for feat1, feat2 in zip(nfeat1, nfeat2):
              if len(feat1) > 0:
                  nfeat_list.append(feat1)
              elif len(feat2) > 0:
                  nfeat_list.append(feat2)
  
          res.append(nfeat_list)
  
imports: import os
  import sys
  import re
  import time
  import tqdm
  import argparse
  import unittest
  import shutil
  import numpy
  from collections import defaultdict
  from pgl.utils.logger import log
  from pgl.distributed import DistGraphClient, DistGraphServer
label_desc: Use image node_id 4 for calling the DistGraphTest obj's underlying member method code with example usage: obj.test_node_feat() without return types