Source code for experimentor.core.measurement_parameters
"""
Measurement Classes
===================
Collection of classes useful for developing the logic of a measurement
.. sectionauthor:: Aquiles Carattino
"""
from numbers import Number
from pint.errors import UndefinedUnitError
from experimentor import Q_
from experimentor.core.exceptions import DuplicatedParameter
[docs]class Parameter:
"""Parameters that belong to a measurement. They allow to define units, limits and ui_classes.
"""
name = ''
def __set_name__(self, owner, name):
self.name = name
if not hasattr(owner, '_parameters'):
setattr(owner, '_parameters', [])
if name in owner._parameters:
raise DuplicatedParameter(f'{name} already exists in {owner}')
owner._parameters.append(name)
def __init__(self, units=None, ui_class=None):
self._value = None
self.units = None
if units:
if isinstance(units, Q_):
self.units = units
else:
try:
self.units = Q_(units)
except UndefinedUnitError:
self.units = None
self.ui_class = ui_class
def __get__(self, instance, owner):
return self._value
def __set__(self, instance, value):
if self.units:
if isinstance(value, Q_):
value = value.to(self.units)
elif isinstance(value, str):
value = Q_(value).to(self.units)
elif isinstance(value, Number):
value = value * self.units
else:
raise Exception(f'Cant set {self.name} to {value}')
self._value = value
if __name__ == '__main__':
class Test:
param = Parameter(units='nm')
t = Test()
print(t.param)
t.param = 5
print(t.param)
t.param = '5mm'
print(t.param)