What’s new?

The sections below will give you the most relevant news from the PyTango releases. For help moving to a new release, or for the complete list of changes, see the following links:

What’s new in PyTango 9.4.0?

Date: 2023-02-15

Type: major release

Changed

  • PyTango requires at least cppTango 9.4.1. See the migration guide.

  • Breaking change to the API when using empty spectrum and image attributes. Clients reading an empty attribute will get an empty sequence (list/tuple/numpy array) instead of a None value. Similarly, devices that have an empty sequence written will receive that in the write method instead of a None value. See the migration guide on empty attributes and extract as.

  • Python dependencies: numpy is no longer optional - it is required. Other new requirements are packaging and psutil.

  • Binary wheels for more platforms, including Linux, are available on PyPI. Fast installation without compiling and figuring out all the dependencies!

  • The dependencies packaged with the binary PyPI wheels are as follows:
    • Linux:
      • cpptango: 9.4.1

      • omniorb: 4.2.4

      • libzmq: v4.3.4

      • cppzmq: v4.7.1

      • libjpeg-turbo: 2.0.9

      • tango-idl: 5.1.1

      • boost: 1.80.0 (with patch for Python 3.11 support)

    • Windows:
      • cpptango: 9.4.1

      • omniorb: 4.2.5

      • libzmq: v4.0.5-2

      • cppzmq: v4.7.1

      • libjpeg-turbo: 2.0.3

      • tango-idl: 5.1.2

      • boost: 1.73.0

  • When using the --port commandline option without --host, the ORBendpoint for gio::tcp passed to cppTango will use "0.0.0.0" as the host instead of an empty string. This is to workaround a regression with cppTango 9.4.1. Note that if the --ORBendPoint commandline option is specified directly, it will not be modified. This will lead to a crash if an empty host is used, e.g., --ORBendPoint giop:tcp::1234.

Added

  • User methods for attribute access (read/write/is allowed), and for commands (execute/is allowed) can be plain functions. They don’t need to be methods on the device class anymore. There was some inconsistency with this previously, but now it is the same for static and dynamic attributes, and for commands. Static and dynamic commands can also take an fisallowed keyword argument. See the migration guide.

  • Device methods for reading and writing dynamic attributes can use the high-level API instead of getting and setting values inside Attr objects. See the migration guide.

  • High-level API support for accessing and creating DevEnum spectrum and image attributes. See the migration guide.

  • Developers can optionally allow Python attributes to be added to a DeviceProxy instance by calling unfreeze_dynamic_interface(). The default behaviour is still to raise an exception when accessing unknown attributes. See the migration guide.

  • Attribute decorators have additional methods: getter(), read() and is_allowed(). See the migration guide.

  • Python 3.11 support.

  • MacOS support. This is easiest installing from Conda-forge. Compiling locally is not recommended. See Getting started.

  • Integrated development environment (IDE) autocompletion for methods inherited from tango.server.Device and tango.LatestDeviceImpl. Attributes from the full class hierarchy are now more easily accessible directly in your editor.

Fixed

  • Log stream calls that include literal % symbols but no args now work properly without raising an exception. E.g., self.debug_stream("I want to log a %s symbol"). See the migration guide.

  • Writing a numpy.array to a spectrum attribute of type str no longer crashes.

  • Reading an enum attribute with ATTR_INVALID quality via the high-level API now returns None instead of crashing. This behaviour is consistent with the other data types.

Removed

  • Support for Python 2.7 and Python 3.5.

  • The option to install PyTango without numpy.