Upgrade to Version 3.x
Python 3.8 deprecated the explicit passing of a loop argument in the high-level asyncio
API. It has since been removed from Python 3.10 and later versions.
For this reason the optional loop argument in the __init__
method of the NetworkConnection
and SerialConnection
classes had to be removed as well. Since this change required a new major release of the SDK, the opportunity has been used to make several improvements to the API.
The following sections list all notable changes compared to the previous 2.x releases.
Removed support for Python 3.5
Due to several changes in the asyncio
library in recent Python releases, the support for Python 3.5 has been removed. The SDK now requires Python 3.6 or later.
Added support for Spyder and Jupyter
The SDK uses Python’s asyncio
library for all device communication. In software (notably Spyder and Jupyter) that already uses an event loop to run Python code, it was not possible to use the synchronous API (“RuntimeError: This event loop is already running”).
Several internal improvements have been made to support this use case. The previously recommended nest_asyncio
package is now unnecessary and can be removed.
Backward incompatible changes
This section lists all backward incompatible changes to the API and their respective replacements.
toptica.lasersdk.asyncio.connection.Connection
The optional loop argument of the __init__
method of the NetworkConnection
and SerialConnection
classes has been removed. asyncio.get_event_loop()
is now used in all cases where access to the event loop is required.
# Previous versions
def __init__(self, ..., loop: asyncio.AbstractEventLoop = None)
# Since version 3.0
def __init__(self, ...)
The monitoring_line_supported
property has been renamed to monitoring_line_available
to more clearly reflect its behaviour.
# Previous versions
def monitoring_line_supported(self) -> bool
# Since version 3.0
def monitoring_line_available(self) -> bool
toptica.lasersdk.client.Client
The set
method no longer raises an exception when a device emits a warning. It now returns the code of the warning as an int (errors continue to raise an exception).
# Previous versions
def set(self, param_name: str, *param_values: DecopType) -> None
# Since version 3.0
def set(self, param_name: str, *param_values: DecopType) -> int
The param_type argument of the subscribe
method is now optional; if it is not provided the type is inferred from the data sent by the device. The callback argument is now required (it was previously optional). The order of both arguments has been swapped.
# Previous versions
def subscribe(self, param_name: str, param_type: DecopMetaType, callback: DecopCallback = None) -> Subscription
# Since version 3.0
def subscribe(self, param_name: str, callback: DecopCallback, param_type: DecopMetaType = None) -> Subscription
toptica.lasersdk.asyncio.client.Client
The set
method no longer raises an exception when a device emits a warning. It now returns the code of the warning as an int (errors continue to raise an exception).
# Previous versions
def set(self, param_name: str, *param_values: DecopType) -> None
# Since Version 3.0
def set(self, param_name: str, *param_values: DecopType) -> int
The param_type argument of the subscribe
method is now optional; if it is not provided the type is inferred from the data sent by the device. The optional callback argument has been removed.
# Previous versions
async def subscribe(self, param_name: str, param_type: DecopMetaType, callback: DecopCallback = None) -> Subscription
# Since Version 3.0
async def subscribe(self, param_name: str, param_type: DecopMetaType = None) -> Subscription
toptica.lasersdk.client.Subscription
The callback argument of the __init__
method is now required (it was previously optional).
# Previous versions
def __init__(self, client: Client, name: str, callback: DecopCallback = None) -> None
# Since version 3.0
def __init__(self, client: Client, name: str, callback: DecopCallback) -> None
The value and exc arguments of the update
method have been merged to more clearly indicate that only one of them can be valid at a time. The update
method can now be awaited.
# Previous versions
def update(self, timestamp: datetime, value: DecopType, exc: DecopError = None) -> None
# Since version 3.0
def update(self, timestamp: Timestamp, value: SubscriptionValue) -> None
toptica.lasersdk.asyncio.client.Subscription
The optional callback argument of the __init__
method has been removed.
# Previous versions
def __init__(self, client: Client, name: str, callback: DecopCallback = None) -> None
# Since Version 3.0
def __init__(self, client: Client, name: str) -> None
The value and exc arguments of the update
method have been merged to more clearly indicate that only one of them can be valid at a time. The update
method can now be awaited.
# Previous versions
def update(self, timestamp: datetime, value: DecopType, exc: DecopError = None) -> None
# Since Version 3.0
async def update(self, timestamp: Timestamp, value: SubscriptionValue) -> None
toptica.lasersdk.[asyncio].client.MutableDecop<Type>|SettableDecop<Type>
The set
method of all mutable and settable DeCoP type classes (MutableDecopInteger
, SettableDecopString
, etc.) no longer raises an exception when a device emits a warning. It now returns the code of the warning as an int (errors continue to raise an exception).
# Previous versions
def set(self, value: int) -> None
# Since Version 3.0
def set(self, value: int) -> int
toptica.lasersdk.client.[Mutable|Settable]Decop<Type>
The callback argument of the subscribe
method of all DeCoP type classes (DecopInteger
, MutableDecopString
, etc.) is now required (this applies only to the synchronous version of the API).
# Previous versions
def subscribe(self, callback: DecopCallback = None) -> Subscription
# Since version 3.0
def subscribe(self, callback: DecopCallback) -> Subscription
toptica.lasersdk.asyncio.client.MutableDecop<Type>|SettableDecop<Type>
The callback argument of the subscribe
method of all async DeCoP type classes (DecopInteger
, MutableDecopString
, etc.) has been removed.
# Previous versions
async def subscribe(self, callback: DecopCallback = None) -> Subscription
# Since version 3.0
async def subscribe(self) -> Subscription