docs: def check_child_attr_data_types(self, ds):
          """
          For any variables which contain any of the following attributes:
              - valid_min/valid_max
              - valid_range
              - scale_factor
              - add_offset
              - _FillValue
          the data type of the attribute must match the type of its parent variable as specified in the
          NetCDF User Guide (NUG) https://www.unidata.ucar.edu/software/netcdf/docs/attribute_conventions.html,
          referenced in the CF Conventions in Section 2.5.2
          (http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/cf-conventions.html#missing-data)
  
          :param netCDF4.Dataset ds: open netCDF dataset object
          :rtype: compliance_checker.base.Result
          """
  
          ctx = TestCtx(BaseCheck.MEDIUM, self.section_titles['2.5'])
          special_attrs = {"actual_range", "actual_min", "actual_max",
                           "valid_min", "valid_max", "valid_range",
                           "scale_factor", "add_offset", "_FillValue"}
  
          for var_name, var in ds.variables.items():
              for att in special_attrs.intersection(var.ncattrs()):
                  val = var.getncattr(att)
                  if isinstance(val, basestring):
                      type_match = var.dtype.kind == 'S'
                      val_type = type(val)
                  else:
                      val_type = val.dtype.type
                      type_match = val_type == var.dtype.type
  
                  ctx.assert_true(type_match,
                      "Attribute '{}' (type: {}) and parent variable '{}' (type: {}) "
                      "must have equivalent datatypes".format(att,
                                                              val_type,
                                                              var_name,
                                                              var.dtype.type)
                      )
          return ctx.to_result()