LSST Applications g0fba68d861+bb7a7cfa1f,g1ec0fe41b4+f536777771,g1fd858c14a+470a99fdf4,g216c3ac8a7+0d4d80193f,g35bb328faa+fcb1d3bbc8,g4d2262a081+23bd310d1b,g53246c7159+fcb1d3bbc8,g56a49b3a55+369644a549,g5a012ec0e7+3632fc3ff3,g60b5630c4e+3bfb9058a5,g67b6fd64d1+ed4b5058f4,g78460c75b0+2f9a1b4bcd,g786e29fd12+cf7ec2a62a,g8180f54f50+60bd39f3b6,g8352419a5c+fcb1d3bbc8,g87d29937c9+57a68d035f,g8852436030+4699110379,g89139ef638+ed4b5058f4,g9125e01d80+fcb1d3bbc8,g94187f82dc+3bfb9058a5,g989de1cb63+ed4b5058f4,g9ccd5d7f00+b7cae620c0,g9d31334357+3bfb9058a5,g9f33ca652e+00883ace41,gabe3b4be73+1e0a283bba,gabf8522325+fa80ff7197,gb1101e3267+27b24065a3,gb58c049af0+f03b321e39,gb89ab40317+ed4b5058f4,gc0af124501+708fe67c54,gcf25f946ba+4699110379,gd6cbbdb0b4+bb83cc51f8,gde0f65d7ad+acd5afb0eb,ge1ad929117+3bfb9058a5,ge278dab8ac+d65b3c2b70,ge410e46f29+ed4b5058f4,gf5e32f922b+fcb1d3bbc8,gf67bdafdda+ed4b5058f4,w.2025.17
LSST Data Management Base Package
Loading...
Searching...
No Matches
lsst.pex.config.configurableField.ConfigurableField Class Reference
Inheritance diagram for lsst.pex.config.configurableField.ConfigurableField:
lsst.pex.config.config.Field lsst.pex.config.configurableField.ConfigurableInstance

Public Member Functions

 validateTarget (self, target, ConfigClass)
 
 __init__ (self, doc, target, ConfigClass=None, default=None, check=None, deprecated=None)
 
ConfigurableField __get__ (self, None instance, Any owner=None, Any at=None, str label="default")
 
ConfigurableInstance[FieldTypeVar__get__ (self, Config instance, Any owner=None, Any at=None, str label="default")
 
 __get__ (self, instance, owner=None, at=None, label="default")
 
 __set__ (self, instance, value, at=None, label="assignment")
 
 rename (self, instance)
 
 save (self, outfile, instance)
 
 freeze (self, instance)
 
 toDict (self, instance)
 
 validate (self, instance)
 
 __deepcopy__ (self, memo)
 
 __class_getitem__ (cls, tuple[type,...]|type|ForwardRef params)
 
 __delete__ (self, instance, at=None, label="deletion")
 
 apply (self, *args, **kw)
 
 retarget (self, target, ConfigClass=None, at=None, label="retarget")
 
 __getattr__ (self, name)
 
 __setattr__ (self, name, value, at=None, label="assignment")
 
 __delattr__ (self, name, at=None, label="delete")
 
 __reduce__ (self)
 

Public Attributes

 dtype = dtype
 
 doc = doc
 
 deprecated = deprecated
 
 default = default
 
 check = check
 
 optional = optional
 
 source = source
 

Static Public Attributes

dict supportedTypes = {str, bool, float, int, complex}
 

Protected Member Functions

 _collectImports (self, instance, imports)
 
 _compare (self, instance1, instance2, shortcut, rtol, atol, output)
 
 _setup (self, doc, dtype, default, check, optional, source, deprecated)
 
 _validateValue (self, value)
 
Config _config (self)
 

Static Protected Member Functions

Mapping[str, Any] _parseTypingArgs (tuple[type,...]|tuple[str,...] params, Mapping[str, Any] kwds)
 

Protected Attributes

 _field = self._field.validateTarget(target, ConfigClass)
 
 _config
 
 _value
 

Properties

 target = property(lambda x: x._target)
 
 ConfigClass = property(lambda x: x._ConfigClass)
 
 value = property(lambda x: x._value)
 

Detailed Description

A configuration field (`~lsst.pex.config.Field` subclass) that can be
can be retargeted towards a different configurable (often a
`lsst.pipe.base.Task` subclass).

The ``ConfigurableField`` is often used to configure subtasks, which are
tasks (`~lsst.pipe.base.Task`) called by a parent task.

Parameters
----------
doc : `str`
    A description of the configuration field.
target : configurable class
    The configurable target. Configurables have a ``ConfigClass``
    attribute. Within the task framework, configurables are
    `lsst.pipe.base.Task` subclasses).
ConfigClass : `lsst.pex.config.Config`-type, optional
    The subclass of `lsst.pex.config.Config` expected as the configuration
    class of the ``target``. If ``ConfigClass`` is unset then
    ``target.ConfigClass`` is used.
default : ``ConfigClass``-type, optional
    The default configuration class. Normally this parameter is not set,
    and defaults to ``ConfigClass`` (or ``target.ConfigClass``).
check : callable, optional
    Callable that takes the field's value (the ``target``) as its only
    positional argument, and returns `True` if the ``target`` is valid (and
    `False` otherwise).
deprecated : None or `str`, optional
    A description of why this Field is deprecated, including removal date.
    If not None, the string is appended to the docstring for this Field.

See Also
--------
ChoiceField
ConfigChoiceField
ConfigDictField
ConfigField
DictField
Field
ListField
RangeField
RegistryField

Notes
-----
You can use the `ConfigurableInstance.apply` method to construct a
fully-configured configurable.

Definition at line 228 of file configurableField.py.

Constructor & Destructor Documentation

◆ __init__()

lsst.pex.config.configurableField.ConfigurableField.__init__ ( self,
doc,
target,
ConfigClass = None,
default = None,
check = None,
deprecated = None )

Definition at line 322 of file configurableField.py.

322 def __init__(self, doc, target, ConfigClass=None, default=None, check=None, deprecated=None):
323 ConfigClass = self.validateTarget(target, ConfigClass)
324
325 if default is None:
326 default = ConfigClass
327 if default != ConfigClass and type(default) is not ConfigClass:
328 raise TypeError(
329 f"'default' is of incorrect type {_typeStr(default)}. Expected {_typeStr(ConfigClass)}"
330 )
331
332 source = getStackFrame()
333 self._setup(
334 doc=doc,
335 dtype=ConfigurableInstance,
336 default=default,
337 check=check,
338 optional=False,
339 source=source,
340 deprecated=deprecated,
341 )
342 self.target = target
343 self.ConfigClass = ConfigClass
344

Member Function Documentation

◆ __class_getitem__()

lsst.pex.config.config.Field.__class_getitem__ ( cls,
tuple[type, ...] | type | ForwardRef params )
inherited

Definition at line 464 of file config.py.

464 def __class_getitem__(cls, params: tuple[type, ...] | type | ForwardRef):
465 return _PexConfigGenericAlias(cls, params)
466

◆ __deepcopy__()

lsst.pex.config.configurableField.ConfigurableField.__deepcopy__ ( self,
memo )
Customize deep-copying, because we always want a reference to the
original typemap.

WARNING: this must be overridden by subclasses if they change the
constructor signature!

Definition at line 441 of file configurableField.py.

441 def __deepcopy__(self, memo):
442 """Customize deep-copying, because we always want a reference to the
443 original typemap.
444
445 WARNING: this must be overridden by subclasses if they change the
446 constructor signature!
447 """
448 return type(self)(
449 doc=self.doc,
450 target=self.target,
451 ConfigClass=self.ConfigClass,
452 default=copy.deepcopy(self.default),
453 )
454

◆ __delattr__()

lsst.pex.config.configurableField.ConfigurableInstance.__delattr__ ( self,
name,
at = None,
label = "delete" )
inherited
Pretend to be an isntance of  ConfigClass.
Attributes defiend by ConfigurableInstance will shadow those defined
in ConfigClass.

Definition at line 202 of file configurableField.py.

202 def __delattr__(self, name, at=None, label="delete"):
203 """
204 Pretend to be an isntance of ConfigClass.
205 Attributes defiend by ConfigurableInstance will shadow those defined
206 in ConfigClass.
207 """
208 if self._config._frozen:
209 raise FieldValidationError(self._field, self._config, "Cannot modify a frozen Config")
210
211 try:
212 # attribute exists in the ConfigurableInstance wrapper
213 object.__delattr__(self, name)
214 except AttributeError:
215 if at is None:
216 at = getCallStack()
217 self._value.__delattr__(name, at=at, label=label)
218

◆ __delete__()

lsst.pex.config.config.Field.__delete__ ( self,
instance,
at = None,
label = "deletion" )
inherited
Delete an attribute from a `lsst.pex.config.Config` instance.

Parameters
----------
instance : `lsst.pex.config.Config`
    The config instance that contains this field.
at : `list` of `lsst.pex.config.callStack.StackFrame`
    The call stack (created by
    `lsst.pex.config.callStack.getCallStack`).
label : `str`, optional
    Event label for the history.

Notes
-----
This is invoked by the owning `~lsst.pex.config.Config` object and
should not be called directly.

Definition at line 800 of file config.py.

800 def __delete__(self, instance, at=None, label="deletion"):
801 """Delete an attribute from a `lsst.pex.config.Config` instance.
802
803 Parameters
804 ----------
805 instance : `lsst.pex.config.Config`
806 The config instance that contains this field.
807 at : `list` of `lsst.pex.config.callStack.StackFrame`
808 The call stack (created by
809 `lsst.pex.config.callStack.getCallStack`).
810 label : `str`, optional
811 Event label for the history.
812
813 Notes
814 -----
815 This is invoked by the owning `~lsst.pex.config.Config` object and
816 should not be called directly.
817 """
818 if at is None:
819 at = getCallStack()
820 self.__set__(instance, None, at=at, label=label)
821

◆ __get__() [1/3]

ConfigurableInstance[FieldTypeVar] lsst.pex.config.configurableField.ConfigurableField.__get__ ( self,
Config instance,
Any owner = None,
Any at = None,
str label = "default" )

Definition at line 366 of file configurableField.py.

368 ) -> ConfigurableInstance[FieldTypeVar]: ...
369

◆ __get__() [2/3]

lsst.pex.config.configurableField.ConfigurableField.__get__ ( self,
instance,
owner = None,
at = None,
label = "default" )

Definition at line 370 of file configurableField.py.

370 def __get__(self, instance, owner=None, at=None, label="default"):
371 if instance is None or not isinstance(instance, Config):
372 return self
373 else:
374 return self.__getOrMake(instance, at=at, label=label)
375

◆ __get__() [3/3]

ConfigurableField lsst.pex.config.configurableField.ConfigurableField.__get__ ( self,
None instance,
Any owner = None,
Any at = None,
str label = "default" )

Definition at line 361 of file configurableField.py.

363 ) -> ConfigurableField: ...
364

◆ __getattr__()

lsst.pex.config.configurableField.ConfigurableInstance.__getattr__ ( self,
name )
inherited

Definition at line 182 of file configurableField.py.

182 def __getattr__(self, name):
183 return getattr(self._value, name)
184

◆ __reduce__()

lsst.pex.config.configurableField.ConfigurableInstance.__reduce__ ( self)
inherited

Definition at line 219 of file configurableField.py.

219 def __reduce__(self):
220 raise UnexpectedProxyUsageError(
221 f"Proxy object for config field {self._field.name} cannot "
222 "be pickled; it should be converted to a normal `Config` instance "
223 "via the `value` property before being assigned to other objects "
224 "or variables."
225 )
226
227

◆ __set__()

lsst.pex.config.configurableField.ConfigurableField.__set__ ( self,
instance,
value,
at = None,
label = "assignment" )

Definition at line 376 of file configurableField.py.

376 def __set__(self, instance, value, at=None, label="assignment"):
377 if instance._frozen:
378 raise FieldValidationError(self, instance, "Cannot modify a frozen Config")
379 if at is None:
380 at = getCallStack()
381 oldValue = self.__getOrMake(instance, at=at)
382
383 if isinstance(value, ConfigurableInstance):
384 oldValue.retarget(value.target, value.ConfigClass, at, label)
385 oldValue.update(__at=at, __label=label, **value._storage)
386 elif type(value) is oldValue._ConfigClass:
387 oldValue.update(__at=at, __label=label, **value._storage)
388 elif value == oldValue.ConfigClass:
389 value = oldValue.ConfigClass()
390 oldValue.update(__at=at, __label=label, **value._storage)
391 else:
392 msg = (
393 f"Value {value} is of incorrect type {_typeStr(value)}. "
394 f"Expected {_typeStr(oldValue.ConfigClass)}"
395 )
396 raise FieldValidationError(self, instance, msg)
397

◆ __setattr__()

lsst.pex.config.configurableField.ConfigurableInstance.__setattr__ ( self,
name,
value,
at = None,
label = "assignment" )
inherited
Pretend to be an instance of ConfigClass.

Attributes defined by ConfigurableInstance will shadow those defined
in ConfigClass

Definition at line 185 of file configurableField.py.

185 def __setattr__(self, name, value, at=None, label="assignment"):
186 """Pretend to be an instance of ConfigClass.
187
188 Attributes defined by ConfigurableInstance will shadow those defined
189 in ConfigClass
190 """
191 if self._config._frozen:
192 raise FieldValidationError(self._field, self._config, "Cannot modify a frozen Config")
193
194 if name in self.__dict__:
195 # attribute exists in the ConfigurableInstance wrapper
196 object.__setattr__(self, name, value)
197 else:
198 if at is None:
199 at = getCallStack()
200 self._value.__setattr__(name, value, at=at, label=label)
201

◆ _collectImports()

lsst.pex.config.configurableField.ConfigurableField._collectImports ( self,
instance,
imports )
protected
Call the _collectImports method on all config
objects the field may own, and union them with the supplied imports
set.

Parameters
----------
instance : instance or subclass of `lsst.pex.config.Config`
    A config object that has this field defined on it
imports : `set`
    Set of python modules that need imported after persistence

Reimplemented from lsst.pex.config.config.Field.

Definition at line 403 of file configurableField.py.

403 def _collectImports(self, instance, imports):
404 value = self.__get__(instance)
405 target = value.target
406 imports.add(target.__module__)
407 value.value._collectImports()
408 imports |= value.value._imports
409

◆ _compare()

lsst.pex.config.configurableField.ConfigurableField._compare ( self,
instance1,
instance2,
shortcut,
rtol,
atol,
output )
protected
Compare two fields for equality.

Used by `lsst.pex.ConfigDictField.compare`.

Parameters
----------
instance1 : `lsst.pex.config.Config`
    Left-hand side config instance to compare.
instance2 : `lsst.pex.config.Config`
    Right-hand side config instance to compare.
shortcut : `bool`
    If `True`, this function returns as soon as an inequality if found.
rtol : `float`
    Relative tolerance for floating point comparisons.
atol : `float`
    Absolute tolerance for floating point comparisons.
output : callable
    A callable that takes a string, used (possibly repeatedly) to
    report inequalities. For example: `print`.

Returns
-------
isEqual : bool
    `True` if the fields are equal, `False` otherwise.

Notes
-----
Floating point comparisons are performed by `numpy.allclose`.

Reimplemented from lsst.pex.config.config.Field.

Definition at line 455 of file configurableField.py.

455 def _compare(self, instance1, instance2, shortcut, rtol, atol, output):
456 """Compare two fields for equality.
457
458 Used by `lsst.pex.ConfigDictField.compare`.
459
460 Parameters
461 ----------
462 instance1 : `lsst.pex.config.Config`
463 Left-hand side config instance to compare.
464 instance2 : `lsst.pex.config.Config`
465 Right-hand side config instance to compare.
466 shortcut : `bool`
467 If `True`, this function returns as soon as an inequality if found.
468 rtol : `float`
469 Relative tolerance for floating point comparisons.
470 atol : `float`
471 Absolute tolerance for floating point comparisons.
472 output : callable
473 A callable that takes a string, used (possibly repeatedly) to
474 report inequalities. For example: `print`.
475
476 Returns
477 -------
478 isEqual : bool
479 `True` if the fields are equal, `False` otherwise.
480
481 Notes
482 -----
483 Floating point comparisons are performed by `numpy.allclose`.
484 """
485 c1 = getattr(instance1, self.name)._value
486 c2 = getattr(instance2, self.name)._value
487 name = getComparisonName(
488 _joinNamePath(instance1._name, self.name), _joinNamePath(instance2._name, self.name)
489 )
490 return compareConfigs(name, c1, c2, shortcut=shortcut, rtol=rtol, atol=atol, output=output)

◆ _config()

Config lsst.pex.config.configurableField.ConfigurableInstance._config ( self)
protectedinherited

Definition at line 111 of file configurableField.py.

111 def _config(self) -> Config:
112 # Config Fields should never outlive their config class instance
113 # assert that as such here
114 assert self._config_() is not None
115 return self._config_()
116

◆ _parseTypingArgs()

Mapping[str, Any] lsst.pex.config.configurableField.ConfigurableField._parseTypingArgs ( tuple[type, ...] | tuple[str, ...] params,
Mapping[str, Any] kwds )
staticprotected
Parse type annotations into keyword constructor arguments.

This is a special private method that interprets type arguments (i.e.
Field[str]) into keyword arguments to be passed on to the constructor.

Subclasses of Field can implement this method to customize how they
handle turning type parameters into keyword arguments (see DictField
for an example)

Parameters
----------
params : `tuple` of `type` or `tuple` of str
    Parameters passed to the type annotation. These will either be
    types or strings. Strings are to interpreted as forward references
    and will be treated as such.
kwds : `MutableMapping` with keys of `str` and values of `Any`
    These are the user supplied keywords that are to be passed to the
    Field constructor.

Returns
-------
kwds : `MutableMapping` with keys of `str` and values of `Any`
    The mapping of keywords that will be passed onto the constructor
    of the Field. Should be filled in with any information gleaned
    from the input parameters.

Raises
------
ValueError
    Raised if params is of incorrect length.
    Raised if a forward reference could not be resolved
    Raised if there is a conflict between params and values in kwds

Reimplemented from lsst.pex.config.config.Field.

Definition at line 346 of file configurableField.py.

348 ) -> Mapping[str, Any]:
349 return kwds
350

◆ _setup()

lsst.pex.config.config.Field._setup ( self,
doc,
dtype,
default,
check,
optional,
source,
deprecated )
protectedinherited
Set attributes, usually during initialization.

Definition at line 486 of file config.py.

486 def _setup(self, doc, dtype, default, check, optional, source, deprecated):
487 """Set attributes, usually during initialization."""
488 self.dtype = dtype
489 """Data type for the field.
490 """
491
492 if not doc:
493 raise ValueError("Docstring is empty.")
494
495 # append the deprecation message to the docstring.
496 if deprecated is not None:
497 doc = f"{doc} Deprecated: {deprecated}"
498 self.doc = doc
499 """A description of the field (`str`).
500 """
501
502 self.deprecated = deprecated
503 """If not None, a description of why this field is deprecated (`str`).
504 """
505
506 self.__doc__ = f"{doc} (`{dtype.__name__}`"
507 if optional or default is not None:
508 self.__doc__ += f", default ``{default!r}``"
509 self.__doc__ += ")"
510
511 self.default = default
512 """Default value for this field.
513 """
514
515 self.check = check
516 """A user-defined function that validates the value of the field.
517 """
518
519 self.optional = optional
520 """Flag that determines if the field is required to be set (`bool`).
521
522 When `False`, `lsst.pex.config.Config.validate` will fail if the
523 field's value is `None`.
524 """
525
526 self.source = source
527 """The stack frame where this field is defined (`list` of
528 `~lsst.pex.config.callStack.StackFrame`).
529 """
530

◆ _validateValue()

lsst.pex.config.config.Field._validateValue ( self,
value )
protectedinherited
Validate a value.

Parameters
----------
value : object
    The value being validated.

Raises
------
TypeError
    Raised if the value's type is incompatible with the field's
    ``dtype``.
ValueError
    Raised if the value is rejected by the ``check`` method.

Reimplemented in lsst.pex.config.choiceField.ChoiceField, and lsst.pex.config.rangeField.RangeField.

Definition at line 598 of file config.py.

598 def _validateValue(self, value):
599 """Validate a value.
600
601 Parameters
602 ----------
603 value : object
604 The value being validated.
605
606 Raises
607 ------
608 TypeError
609 Raised if the value's type is incompatible with the field's
610 ``dtype``.
611 ValueError
612 Raised if the value is rejected by the ``check`` method.
613 """
614 if value is None:
615 return
616
617 if not isinstance(value, self.dtype):
618 msg = (
619 f"Value {value} is of incorrect type {_typeStr(value)}. Expected type {_typeStr(self.dtype)}"
620 )
621 raise TypeError(msg)
622 if self.check is not None and not self.check(value):
623 msg = f"Value {value} is not a valid value"
624 raise ValueError(msg)
625

◆ apply()

lsst.pex.config.configurableField.ConfigurableInstance.apply ( self,
* args,
** kw )
inherited
Call the configurable.

Parameters
----------
*args : `~typing.Any`
    Arguments to use when calling the configurable.
**kw : `~typing.Any`
    Keyword parameters to use when calling.

Notes
-----
In addition to the user-provided positional and keyword arguments,
the configurable is also provided a keyword argument ``config`` with
the value of `ConfigurableInstance.value`.

Definition at line 130 of file configurableField.py.

130 def apply(self, *args, **kw):
131 """Call the configurable.
132
133 Parameters
134 ----------
135 *args : `~typing.Any`
136 Arguments to use when calling the configurable.
137 **kw : `~typing.Any`
138 Keyword parameters to use when calling.
139
140 Notes
141 -----
142 In addition to the user-provided positional and keyword arguments,
143 the configurable is also provided a keyword argument ``config`` with
144 the value of `ConfigurableInstance.value`.
145 """
146 return self.target(*args, config=self.value, **kw)
147

◆ freeze()

lsst.pex.config.configurableField.ConfigurableField.freeze ( self,
instance )
Make this field read-only (for internal use only).

Parameters
----------
instance : `lsst.pex.config.Config`
    The config instance that contains this field.

Notes
-----
Freezing is only relevant for fields that hold subconfigs. Fields which
hold subconfigs should freeze each subconfig.

**Subclasses should implement this method.**

Reimplemented from lsst.pex.config.config.Field.

Definition at line 425 of file configurableField.py.

425 def freeze(self, instance):
426 value = self.__getOrMake(instance)
427 value.freeze()
428

◆ rename()

lsst.pex.config.configurableField.ConfigurableField.rename ( self,
instance )
Rename the field in a `~lsst.pex.config.Config` (for internal use
only).

Parameters
----------
instance : `lsst.pex.config.Config`
    The config instance that contains this field.

Notes
-----
This method is invoked by the `lsst.pex.config.Config` object that
contains this field and should not be called directly.

Renaming is only relevant for `~lsst.pex.config.Field` instances that
hold subconfigs. `~lsst.pex.config.Field`\s that hold subconfigs should
rename each subconfig with the full field name as generated by
`lsst.pex.config.config._joinNamePath`.

Reimplemented from lsst.pex.config.config.Field.

Definition at line 398 of file configurableField.py.

398 def rename(self, instance):
399 fullname = _joinNamePath(instance._name, self.name)
400 value = self.__getOrMake(instance)
401 value._rename(fullname)
402

◆ retarget()

lsst.pex.config.configurableField.ConfigurableInstance.retarget ( self,
target,
ConfigClass = None,
at = None,
label = "retarget" )
inherited
Target a new configurable and ConfigClass.

Parameters
----------
target : `type`
    Item to retarget.
ConfigClass : `type` or `None`, optional
    New config class to use.
at : `list` of `~lsst.pex.config.callStack.StackFrame` or `None`,\
        optional
    Stack for history recording.
label : `str`, optional
    Label for history recording.

Definition at line 148 of file configurableField.py.

148 def retarget(self, target, ConfigClass=None, at=None, label="retarget"):
149 """Target a new configurable and ConfigClass.
150
151 Parameters
152 ----------
153 target : `type`
154 Item to retarget.
155 ConfigClass : `type` or `None`, optional
156 New config class to use.
157 at : `list` of `~lsst.pex.config.callStack.StackFrame` or `None`,\
158 optional
159 Stack for history recording.
160 label : `str`, optional
161 Label for history recording.
162 """
163 if self._config._frozen:
164 raise FieldValidationError(self._field, self._config, "Cannot modify a frozen Config")
165
166 try:
167 ConfigClass = self._field.validateTarget(target, ConfigClass)
168 except BaseException as e:
169 raise FieldValidationError(self._field, self._config, e.message) from e
170
171 if at is None:
172 at = getCallStack()
173 object.__setattr__(self, "_target", target)
174 if ConfigClass != self.ConfigClass:
175 object.__setattr__(self, "_ConfigClass", ConfigClass)
176 self.__initValue(at, label)
177
178 history = self._config._history.setdefault(self._field.name, [])
179 msg = f"retarget(target={_typeStr(target)}, ConfigClass={_typeStr(ConfigClass)})"
180 history.append((msg, at, label))
181

◆ save()

lsst.pex.config.configurableField.ConfigurableField.save ( self,
outfile,
instance )
Save this field to a file (for internal use only).

Parameters
----------
outfile : file-like object
    A writeable field handle.
instance : `~lsst.pex.config.Config`
    The `~lsst.pex.config.Config` instance that contains this field.

Notes
-----
This method is invoked by the `~lsst.pex.config.Config` object that
contains this field and should not be called directly.

The output consists of the documentation string
(`lsst.pex.config.Field.doc`) formatted as a Python comment. The second
line is formatted as an assignment: ``{fullname}={value}``.

This output can be executed with Python.

Reimplemented from lsst.pex.config.config.Field.

Definition at line 410 of file configurableField.py.

410 def save(self, outfile, instance):
411 fullname = _joinNamePath(instance._name, self.name)
412 value = self.__getOrMake(instance)
413 target = value.target
414
415 if target != self.target:
416 # not targeting the field-default target.
417 # save target information
418 ConfigClass = value.ConfigClass
419 outfile.write(
420 f"{fullname}.retarget(target={_typeStr(target)}, ConfigClass={_typeStr(ConfigClass)})\n\n"
421 )
422 # save field values
423 value._save(outfile)
424

◆ toDict()

lsst.pex.config.configurableField.ConfigurableField.toDict ( self,
instance )
Convert the field value so that it can be set as the value of an
item in a `dict` (for internal use only).

Parameters
----------
instance : `~lsst.pex.config.Config`
    The `~lsst.pex.config.Config` that contains this field.

Returns
-------
value : object
    The field's value. See *Notes*.

Notes
-----
This method invoked by the owning `~lsst.pex.config.Config` object and
should not be called directly.

Simple values are passed through. Complex data structures must be
manipulated. For example, a `~lsst.pex.config.Field` holding a
subconfig should, instead of the subconfig object, return a `dict`
where the keys are the field names in the subconfig, and the values are
the field values in the subconfig.

Reimplemented from lsst.pex.config.config.Field.

Definition at line 429 of file configurableField.py.

429 def toDict(self, instance):
430 value = self.__get__(instance)
431 return value.toDict()
432

◆ validate()

lsst.pex.config.configurableField.ConfigurableField.validate ( self,
instance )
Validate the field (for internal use only).

Parameters
----------
instance : `lsst.pex.config.Config`
    The config instance that contains this field.

Raises
------
lsst.pex.config.FieldValidationError
    Raised if verification fails.

Notes
-----
This method provides basic validation:

- Ensures that the value is not `None` if the field is not optional.
- Ensures type correctness.
- Ensures that the user-provided ``check`` function is valid.

Most `~lsst.pex.config.Field` subclasses should call
`lsst.pex.config.Field.validate` if they re-implement
`~lsst.pex.config.Field.validate`.

Reimplemented from lsst.pex.config.config.Field.

Definition at line 433 of file configurableField.py.

433 def validate(self, instance):
434 value = self.__get__(instance)
435 value.validate()
436
437 if self.check is not None and not self.check(value):
438 msg = f"{value} is not a valid value"
439 raise FieldValidationError(self, instance, msg)
440

◆ validateTarget()

lsst.pex.config.configurableField.ConfigurableField.validateTarget ( self,
target,
ConfigClass )
Validate the target and configuration class.

Parameters
----------
target : configurable class
    The configurable being verified.
ConfigClass : `lsst.pex.config.Config`-type or `None`
    The configuration class associated with the ``target``. This can
    be `None` if ``target`` has a ``ConfigClass`` attribute.

Raises
------
AttributeError
    Raised if ``ConfigClass`` is `None` and ``target`` does not have a
    ``ConfigClass`` attribute.
TypeError
    Raised if ``ConfigClass`` is not a `~lsst.pex.config.Config`
    subclass.
ValueError
    Raised if:

    - ``target`` is not callable (callables have a ``__call__``
      method).
    - ``target`` is not startically defined (does not have
      ``__module__`` or ``__name__`` attributes).

Definition at line 277 of file configurableField.py.

277 def validateTarget(self, target, ConfigClass):
278 """Validate the target and configuration class.
279
280 Parameters
281 ----------
282 target : configurable class
283 The configurable being verified.
284 ConfigClass : `lsst.pex.config.Config`-type or `None`
285 The configuration class associated with the ``target``. This can
286 be `None` if ``target`` has a ``ConfigClass`` attribute.
287
288 Raises
289 ------
290 AttributeError
291 Raised if ``ConfigClass`` is `None` and ``target`` does not have a
292 ``ConfigClass`` attribute.
293 TypeError
294 Raised if ``ConfigClass`` is not a `~lsst.pex.config.Config`
295 subclass.
296 ValueError
297 Raised if:
298
299 - ``target`` is not callable (callables have a ``__call__``
300 method).
301 - ``target`` is not startically defined (does not have
302 ``__module__`` or ``__name__`` attributes).
303 """
304 if ConfigClass is None:
305 try:
306 ConfigClass = target.ConfigClass
307 except Exception as e:
308 raise AttributeError("'target' must define attribute 'ConfigClass'") from e
309 if not issubclass(ConfigClass, Config):
310 raise TypeError(
311 f"'ConfigClass' is of incorrect type {_typeStr(ConfigClass)}. "
312 "'ConfigClass' must be a subclass of Config"
313 )
314 if not callable(target):
315 raise ValueError("'target' must be callable")
316 if not hasattr(target, "__module__") or not hasattr(target, "__name__"):
317 raise ValueError(
318 "'target' must be statically defined (must have '__module__' and '__name__' attributes)"
319 )
320 return ConfigClass
321

Member Data Documentation

◆ _config

lsst.pex.config.configurableField.ConfigurableInstance._config
protectedinherited

Definition at line 164 of file configurableField.py.

◆ _field

lsst.pex.config.configurableField.ConfigurableInstance._field = self._field.validateTarget(target, ConfigClass)
protectedinherited

Definition at line 164 of file configurableField.py.

◆ _value

lsst.pex.config.configurableField.ConfigurableInstance._value
protectedinherited

Definition at line 183 of file configurableField.py.

◆ check

lsst.pex.config.config.Field.check = check
inherited

Definition at line 515 of file config.py.

◆ default

lsst.pex.config.config.Field.default = default
inherited

Definition at line 511 of file config.py.

◆ deprecated

lsst.pex.config.config.Field.deprecated = deprecated
inherited

Definition at line 502 of file config.py.

◆ doc

lsst.pex.config.config.Field.doc = doc
inherited

Definition at line 498 of file config.py.

◆ dtype

lsst.pex.config.config.Field.dtype = dtype
inherited

Definition at line 488 of file config.py.

◆ optional

lsst.pex.config.config.Field.optional = optional
inherited

Definition at line 519 of file config.py.

◆ source

lsst.pex.config.config.Field.source = source
inherited

Definition at line 526 of file config.py.

◆ supportedTypes

dict lsst.pex.config.config.Field.supportedTypes = {str, bool, float, int, complex}
staticinherited

Definition at line 405 of file config.py.

Property Documentation

◆ ConfigClass

lsst.pex.config.configurableField.ConfigurableInstance.ConfigClass = property(lambda x: x._ConfigClass)
staticinherited

Definition at line 121 of file configurableField.py.

◆ target

lsst.pex.config.configurableField.ConfigurableInstance.target = property(lambda x: x._target)
staticinherited

Definition at line 117 of file configurableField.py.

◆ value

lsst.pex.config.configurableField.ConfigurableInstance.value = property(lambda x: x._value)
staticinherited

Definition at line 125 of file configurableField.py.


The documentation for this class was generated from the following file: