21 from __future__
import annotations
23 __all__ = (
"ConfigurableActionField",)
29 from .
import ConfigurableAction
33 """`ConfigurableActionField` is a subclass of `~lsst.pex.config.Field` that
34 allows a single `ConfigurableAction` (or a subclass of thus) to be
35 assigned to it. The `ConfigurableAction` is then accessed through this
36 field for further configuration.
38 Any configuration that is done prior to reasignment to a new
39 `ConfigurableAction` is forgotten.
45 def __set__(self, instance, value, at=None, label="assignment"):
47 raise FieldValidationError(self, instance,
48 "Cannot modify a frozen Config")
49 name = _joinNamePath(prefix=instance._name, name=self.name)
51 if not isinstance(value, self.dtype)
and not issubclass(value, self.dtype):
52 msg = f
"Value {value} is of incorrect type {_typeStr(value)}. Expected {_typeStr(self.dtype)}"
53 raise FieldValidationError(self, instance, msg)
58 if isinstance(value, self.dtype):
59 instance._storage[self.name] = type(value)(__name=name, __at=at,
60 __label=label, **value._storage)
62 instance._storage[self.name] = value(__name=name, __at=at, __label=label)
63 history = instance._history.setdefault(self.name, [])
64 history.append((
"config value set", at, label))
66 def __init__(self, doc, dtype=ConfigurableAction, default=None, check=None, deprecated=None):
67 if not issubclass(dtype, ConfigurableAction):
68 raise ValueError(
"dtype must be a subclass of ConfigurableAction")
69 super().
__init__(doc=doc, dtype=dtype, default=default, check=check, deprecated=deprecated)
def __set__(self, instance, value, at=None, label="assignment")
def __init__(self, doc, dtype=ConfigurableAction, default=None, check=None, deprecated=None)