docs: def _transform_value(self):
          """Mangle the value into a numpy array. This does several things:
  
          - If it is stringlike (bytes or unicode) and the expected shape is
            1D, it is split into an array of characters.
          - It is coerced to a numpy array, enforcing the dtype and order. Where
            possible, no copy is made.
          - The shape is checked against the expected shape.
  
          Returns
          -------
          value : :py:class:`numpy.ndarray`
              The transformed value
  
          Raises
          ------
          ValueError
              if the value is `None`
          ValueError
              if the value has the wrong shape
          TypeError
              if numpy raised it when trying to convert the value
          """
          value = self.value
          if value is None:
              raise ValueError('Cannot send a value of None')
          if (isinstance(value, (six.binary_type, six.text_type)) and
                  len(self.shape) == 1):
              # This is complicated by Python 3 not providing a simple way to
              # turn a bytes object into a list of one-byte objects, the way
              # list(str) does.
              value = [self.value[i : i + 1] for i in range(len(self.value))]
          value = _np.array(value, dtype=self._internal_dtype, order=self.order, copy=False)
          if not self.compatible_shape(value.shape):
              raise ValueError('Value has shape {}, expected {}'.format(value.shape, self.shape))
          return value