21from __future__
import annotations
23__all__ = (
"ConfigurableActionField",)
29from .
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 save(self, outfile, instance):
71 value = self.__get__(instance)
72 fullname = _joinNamePath(instance._name, self.name)
73 outfile.write(f
"{fullname}={_typeStr(value)}\n")
74 super().
save(outfile, instance)
76 def __init__(self, doc, dtype=ConfigurableAction, default=None, check=None, deprecated=None):
77 if not issubclass(dtype, ConfigurableAction):
78 raise ValueError(
"dtype must be a subclass of ConfigurableAction")
79 super().
__init__(doc=doc, dtype=dtype, default=default, check=check, deprecated=deprecated)
def __set__(self, instance, value, at=None, label="assignment")
def save(self, outfile, instance)
def __init__(self, doc, dtype=ConfigurableAction, default=None, check=None, deprecated=None)