docs: def set(self, data_type, values):
          """Set the attribute value.
  
          Args::
  
            data_type    : attribute data type (see constants HC.xxx)
            values       : attribute value(s); specify a list to create
                           a multi-valued attribute; a string valued
                           attribute can be created by setting 'data_type'
                           to HC.CHAR8 and 'values' to the corresponding
                           string
  
                           If the attribute already exists, it will be
                           updated. However, it is illegal to try to change
                           its data type or its order (number of values).
  
          Returns::
  
            None
  
          C library equivalent : VSsetattr
  
                                                    """
          try:
              n_values = len(values)
          except:
              values = [values]
              n_values = 1
          if data_type == HC.CHAR8:
              buf = _C.array_byte(n_values)
              # Allow values to be passed as a string.
              # Noop if a list is passed.
              values = list(values)
              for n in range(n_values):
                  if not isinstance(values[n], int):
                      values[n] = ord(values[n])
  
          elif data_type in [HC.UCHAR8, HC.UINT8]:
              buf = _C.array_byte(n_values)
  
          elif data_type == HC.INT8:
              # SWIG refuses negative values here. We found that if we
              # pass them as byte values, it will work.
              buf = _C.array_int8(n_values)
              values = list(values)
              for n in range(n_values):
                  v = values[n]
                  if v >= 0:
                      v &= 0x7f
                  else:
                      v = abs(v) & 0x7f
                      if v:
                          v = 256 - v
                      else:
                          v = 128         # -128 in 2s complement
                  values[n] = v
  
          elif data_type == HC.INT16:
              buf = _C.array_int16(n_values)
  
          elif data_type == HC.UINT16:
              buf = _C.array_uint16(n_values)
  
          elif data_type == HC.INT32:
              buf = _C.array_int32(n_values)
  
          elif data_type == HC.UINT32:
              buf = _C.array_uint32(n_values)
  
          elif data_type == HC.FLOAT32:
              buf = _C.array_float32(n_values)
  
          elif data_type == HC.FLOAT64:
              buf = _C.array_float64(n_values)
  
          else:
              raise HDF4Error("set: illegal or unimplemented data_type")
  
          for n in range(n_values):
              buf[n] = values[n]
          status = _C.VSsetattr(self._vd_inst._id, self._fIndex, self._name,
                                data_type, n_values, buf)
          _checkErr('attr', status, 'cannot execute')
          # Update the attribute index
          self._index = _C.VSfindattr(self._vd_inst._id, self._fIndex,
                                      self._name);
          if self._index < 0:
              raise HDF4Error("set: error retrieving attribute index")