code: def check(self, arg, *args):
      if numpy is None:
          if isinstance(arg, MPI.Datatype):
              mt1 = arg.Dup()
              dt1 = tonumpy(mt1)
              mt1.Free()
          return
  
      if isinstance(arg, MPI.Datatype):
          mt1 = arg.Dup()
          dt1 = tonumpy(mt1)
      else:
          dt1 = np_dtype(arg, *args)
          mt1 = fromnumpy(dt1)
      dt2 = tonumpy(mt1)
      mt2 = fromnumpy(dt2)
      dt3 = tonumpy(mt2)
      mt3 = fromnumpy(dt3)
      try:
          self.assertEqual(dt1, dt2)
          self.assertEqual(dt2, dt3)
          if isinstance(arg, MPI.Datatype):
              if arg.combiner not in (
                  MPI.COMBINER_INDEXED,
                  MPI.COMBINER_HINDEXED,
                  MPI.COMBINER_INDEXED_BLOCK,
                  MPI.COMBINER_HINDEXED_BLOCK,
              ):
                  self.assertEqual(dt1.itemsize, mt1.extent)
          self.assertEqual(dt2.itemsize, mt2.extent)
          self.assertEqual(dt3.itemsize, mt3.extent)
      finally:
          mt1.Free()
          mt2.Free()
          mt3.Free()
  
imports: from mpi4py import MPI
  from mpi4py.util.dtlib import from_numpy_dtype
  from mpi4py.util.dtlib import to_numpy_dtype
  import sys, os
  import itertools
label_desc: Use image node_id 1 for calling the TestUtilDTLib obj's underlying member method code with example usage: obj.check(arg) without return types