qudi.util.descriptors

Descriptor objects that can be used to simplify common tasks related to object attributes.

Classes

BaseAttribute()

Base descriptor class implementing trivial get/set/delete behaviour for an instance attribute.

DefaultAttribute(default)

Attribute that can be given a default value which is used if not explicitly initialized by the instance.

ReadOnlyAttribute(default)

Extension of DefaultAttribute to be read-only.

TypedAttribute(valid_types, default)

Extension of DefaultAttribute including type checking via isinstance.

CheckedAttribute(static_validators, ...)

Extension of DefaultAttribute including optional validation via static or bound validator methods as well as optional type checking via "isinstance".

DefaultMixin(default, **kwargs)

Mixin for BaseAttribute introducing optional default value behaviour in __get__.

ReadOnlyMixin()

Mixin for BaseAttribute introducing read-only access

TypedMixin([valid_types])

Mixin for BaseAttribute introducing optional type checking via isinstance builtin

ValidateMixin([static_validators])

Mixin for BaseAttribute introducing optional validation via registering static and/or bound validator methods.

class qudi.util.descriptors.BaseAttribute[source]

Bases: builtins.object

Base descriptor class implementing trivial get/set/delete behaviour for an instance attribute.

class qudi.util.descriptors.CheckedAttribute(static_validators: ~typing.Iterable[~typing.Callable[[~typing.Any], None]] | None = None, valid_types: ~typing.Iterable[~typing.Type] | None = None, default: ~typing.Any | None = <object object>)[source]

Bases: qudi.util.descriptors.TypedMixin, qudi.util.descriptors.ValidateMixin, qudi.util.descriptors.DefaultAttribute

Extension of DefaultAttribute including optional validation via static or bound validator methods as well as optional type checking via “isinstance”. A given default value is not validated. Type checking is performed before validation. Register bound validator methods via the CheckedAttribute.validator decorator. This decorator can be combined with classmethod/staticmethod decorators in any order.

Example usage:

def my_static_validator(value):
if not (0 <= value <= 100):

raise ValueError(‘Value must be number between 0 and 100’)

class Test:

variable_a = CheckedAttribute([my_static_validator], [int, float], 0) variable_b = CheckedAttribute(valid_types=[str]) _valid_strings = [‘A’, ‘B’, ‘C’]

def __init__(self):

self.variable_a = 66.7 self.variable_b = ‘B’ assert self.variable_a == 66.7 assert self.variable_b == ‘B’ # The following would raise ValueError # self.variable_a = 101 # self.variable_b = ‘D’

@variable_b.validator @classmethod def _validate_variable_b(cls, value):

if value not in cls._valid_strings:

raise ValueError(f’Invalid string. Valid strings are: {cls._valid_strings}’)

class qudi.util.descriptors.DefaultAttribute(default: ~typing.Any | None = <object object>)[source]

Bases: qudi.util.descriptors.DefaultMixin, qudi.util.descriptors.BaseAttribute

Attribute that can be given a default value which is used if not explicitly initialized by the instance.

Example usage:

class Test:

variable_a = DefaultAttribute(42) variable_b = DefaultAttribute() def __init__(self):

self.variable_b = self.variable_a - 42 assert self.variable_a == 42 assert self.variable_b == 0

class qudi.util.descriptors.DefaultMixin(default: ~typing.Any | None = <object object>, **kwargs)[source]

Bases: builtins.object

Mixin for BaseAttribute introducing optional default value behaviour in __get__. If no default value is specified, fall back to raising AttributeError.

class qudi.util.descriptors.ReadOnlyAttribute(default: ~typing.Any | None = <object object>)[source]

Bases: qudi.util.descriptors.ReadOnlyMixin, qudi.util.descriptors.DefaultAttribute

Extension of DefaultAttribute to be read-only. A non-default value can be set by calling “set_value(instance, value)” on the descriptor instance.

Example usage:

class Test:

variable_a = ReadOnlyAttribute(42) variable_b = ReadOnlyAttribute() def __init__(self):

self.__class__.variable_b.set_value(self, self.variable_a - 42) assert self.variable_a == 42 assert self.variable_b == 0 # The following would raise an AttributeError # self.variable_b = 0

class qudi.util.descriptors.ReadOnlyMixin[source]

Bases: builtins.object

Mixin for BaseAttribute introducing read-only access

set_value(instance: object, value: Any) None[source]
class qudi.util.descriptors.TypedAttribute(valid_types: ~typing.Iterable[~typing.Type] | None = None, default: ~typing.Any | None = <object object>)[source]

Bases: qudi.util.descriptors.TypedMixin, qudi.util.descriptors.DefaultAttribute

Extension of DefaultAttribute including type checking via isinstance. A given default value is not type-checked.

Example usage:

class Test:

variable_a = TypedAttribute([int, float]) variable_b = TypedAttribute([str], None) def __init__(self):

assert self.variable_b is None self.variable_a = 42 self.variable_b = ‘hello world’ assert self.variable_a == 42 assert self.variable_b == ‘hello world’ # The following would raise TypeError # self.variable_a = self.variable_b = None

class qudi.util.descriptors.TypedMixin(valid_types: Iterable[Type] | None = None, **kwargs)[source]

Bases: builtins.object

Mixin for BaseAttribute introducing optional type checking via isinstance builtin

check_type(value: Any) None[source]
class qudi.util.descriptors.ValidateMixin(static_validators: Iterable[Callable[[Any], None]] | None = None, **kwargs)[source]

Bases: builtins.object

Mixin for BaseAttribute introducing optional validation via registering static and/or bound validator methods. Bound methods are best registered via the “validator” decorator (cooperative with staticmethod/classmethod decorator)

validate(value: Any, instance: Any | None = None) None[source]
validator(func: staticmethod | classmethod | Callable[[Any], None]) staticmethod | classmethod | Callable[[Any], None][source]

Decorator to register either a static or bound validator