# Changes to extract_as when reading spectrum and image attributes

When a client reads a spectrum or image attribute, the default behaviour is to return the data in a `tuple` for strings and enumerated types, or a `numpy.ndarray` for other types. This can be changed using the `extract_as` argument passed to `tango.DeviceProxy.read_attribute()` (and similar methods).

Changes in 9.4.x affect the results when using `tango.ExtractAs.Bytes`, `tango.ExtractAs.ByteArray`, and `tango.ExtractAs.String`. The methods are a little unusual as they try to provide the raw data values as bytes or strings, rather than the original data type.

## Keep value and w_value separate

Prior to 9.4.x, the data in the `tango.DeviceAttribute` `value` and `w_value` fields would be concatenated (respectively) and returned in the `value` field. For a read-only attributes this was reasonable, but not for read-write attributes.

In 9.4.x, the data in the two fields remains independent.

## Disabled types

Extracting data to bytes and strings has been disabled for attributes of type `DevString` because concatenating the data from all the strings is not clearly defined. E.g., should null termination characters be included for each item? This may be re-enabled in future, once the solution becomes clear.

## Problems with UTF-8 encoding

For arbitrary binary data, it is not always possible to convert it into a Python `str`. The conversion from bytes will attempt to decode the data assuming UTF-8 encoding, so many byte sequences are invalid. This is not a new problem in version 9.4.x, but will be noticeable if moving from Python 2 to Python 3. For arbitrary data, including numeric types, rather extract to `bytes` or `bytearray`.