code: def testAttrCopyDelete(self):
      cls, obj, null = type(self.obj), self.obj, self.NULL
      #
      self.keyval = cls.Create_keyval(
          copy_fn=lambda o, k, v: cls.Dup(v),
          delete_fn=lambda o, k, v: cls.Free(v),
      )
      self.assertNotEqual(self.keyval, MPI.KEYVAL_INVALID)
      #
      obj1 = obj
      dup1 = obj1.Dup()
      obj1.Set_attr(self.keyval, dup1)
      self.assertNotEqual(dup1, null)
      obj2 = obj1.Dup()
      dup2 = obj2.Get_attr(self.keyval)
      self.assertNotEqual(dup1, dup2)
      obj2.Free()
      self.assertEqual(dup2, null)
      self.obj.Delete_attr(self.keyval)
      self.assertEqual(dup1, null)
  
imports: from mpi4py import MPI
  import mpiunittest
label_desc: Use image node_id 1 for calling the BaseTestCommAttr obj's underlying member method code with example usage: obj.testAttrCopyDelete() without return types