LSST Applications 27.0.0,g0265f82a02+469cd937ee,g02d81e74bb+21ad69e7e1,g1470d8bcf6+cbe83ee85a,g2079a07aa2+e67c6346a6,g212a7c68fe+04a9158687,g2305ad1205+94392ce272,g295015adf3+81dd352a9d,g2bbee38e9b+469cd937ee,g337abbeb29+469cd937ee,g3939d97d7f+72a9f7b576,g487adcacf7+71499e7cba,g50ff169b8f+5929b3527e,g52b1c1532d+a6fc98d2e7,g591dd9f2cf+df404f777f,g5a732f18d5+be83d3ecdb,g64a986408d+21ad69e7e1,g858d7b2824+21ad69e7e1,g8a8a8dda67+a6fc98d2e7,g99cad8db69+f62e5b0af5,g9ddcbc5298+d4bad12328,ga1e77700b3+9c366c4306,ga8c6da7877+71e4819109,gb0e22166c9+25ba2f69a1,gb6a65358fc+469cd937ee,gbb8dafda3b+69d3c0e320,gc07e1c2157+a98bf949bb,gc120e1dc64+615ec43309,gc28159a63d+469cd937ee,gcf0d15dbbd+72a9f7b576,gdaeeff99f8+a38ce5ea23,ge6526c86ff+3a7c1ac5f1,ge79ae78c31+469cd937ee,gee10cc3b42+a6fc98d2e7,gf1cff7945b+21ad69e7e1,gfbcc870c63+9a11dc8c8f
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | List of all members
lsst.pex.config.configChoiceField.ConfigChoiceField Class Reference
Inheritance diagram for lsst.pex.config.configChoiceField.ConfigChoiceField:
lsst.pex.config.config.Field lsst.pex.config.configChoiceField.ConfigInstanceDict lsst.pex.config.config.Config lsst.pex.config.config.ConfigMeta lsst.pex.config.registry.RegistryField

Public Member Functions

 __init__ (self, doc, typemap, default=None, optional=False, multi=False, deprecated=None)
 
 __class_getitem__ (cls, tuple[type,...]|type|ForwardRef params)
 
ConfigChoiceField __get__ (self, None instance, Any owner=None, Any at=None, str label="default")
 
ConfigInstanceDict __get__ (self, Config instance, Any owner=None, Any at=None, str label="default")
 
 __get__ (self, instance, owner=None, at=None, label="default")
 
None __set__ (self, Config instance, ConfigInstanceDict|None value, Any at=None, str label="assignment")
 
 rename (self, instance)
 
 validate (self, instance)
 
 toDict (self, instance)
 
 freeze (self, instance)
 
 save (self, outfile, instance)
 
 __deepcopy__ (self, memo)
 

Public Attributes

 typemap
 
 multi
 
 name
 

Static Public Attributes

 instanceDictClass = ConfigInstanceDict
 

Protected Member Functions

 _getOrMake (self, instance, label="default")
 
 _collectImports (self, instance, imports)
 
 _compare (self, instance1, instance2, shortcut, rtol, atol, output)
 

Detailed Description

A configuration field (`~lsst.pex.config.Field` subclass) that allows a
user to choose from a set of `~lsst.pex.config.Config` types.

Parameters
----------
doc : `str`
    Documentation string for the field.
typemap : `dict`-like
    A mapping between keys and `~lsst.pex.config.Config`-types as values.
    See *Examples* for details.
default : `str`, optional
    The default configuration name.
optional : `bool`, optional
    When `False`, `lsst.pex.config.Config.validate` will fail if the
    field's value is `None`.
multi : `bool`, optional
    If `True`, the field allows multiple selections. In this case, set the
    selections by assigning a sequence to the ``names`` attribute of the
    field.

    If `False`, the field allows only a single selection. In this case,
    set the active config by assigning the config's key from the
    ``typemap`` to the field's ``name`` attribute (see *Examples*).
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
ConfigDictField
ConfigField
ConfigurableField
DictField
Field
ListField
RangeField
RegistryField

Notes
-----
``ConfigChoiceField`` instances can allow either single selections or
multiple selections, depending on the ``multi`` parameter. For
single-selection fields, set the selection with the ``name`` attribute.
For multi-selection fields, set the selection though the ``names``
attribute.

This field is validated only against the active selection. If the
``active`` attribute is `None` and the field is not optional, validation
will fail.

When saving a configuration with a ``ConfigChoiceField``, the entire set is
saved, as well as the active selection.

Examples
--------
While the ``typemap`` is shared by all instances of the field, each
instance of the field has its own instance of a particular sub-config type.

For example, ``AaaConfig`` is a config object

>>> from lsst.pex.config import Config, ConfigChoiceField, Field
>>> class AaaConfig(Config):
...     somefield = Field("doc", int)
...

The ``MyConfig`` config has a ``ConfigChoiceField`` field called ``choice``
that maps the ``AaaConfig`` type to the ``"AAA"`` key:

>>> TYPEMAP = {"AAA", AaaConfig}
>>> class MyConfig(Config):
...     choice = ConfigChoiceField("doc for choice", TYPEMAP)
...

Creating an instance of ``MyConfig``:

>>> instance = MyConfig()

Setting value of the field ``somefield`` on the "AAA" key of the ``choice``
field:

>>> instance.choice['AAA'].somefield = 5

**Selecting the active configuration**

Make the ``"AAA"`` key the active configuration value for the ``choice``
field:

>>> instance.choice = "AAA"

Alternatively, the last line can be written:

>>> instance.choice.name = "AAA"

(If the config instance allows multiple selections, you'd assign a sequence
to the ``names`` attribute instead.)

``ConfigChoiceField`` instances also allow multiple values of the same
type:

>>> TYPEMAP["CCC"] = AaaConfig
>>> TYPEMAP["BBB"] = AaaConfig

Definition at line 383 of file configChoiceField.py.

Constructor & Destructor Documentation

◆ __init__()

lsst.pex.config.configChoiceField.ConfigChoiceField.__init__ ( self,
doc,
typemap,
default = None,
optional = False,
multi = False,
deprecated = None )

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

Reimplemented in lsst.pex.config.registry.RegistryField.

Definition at line 490 of file configChoiceField.py.

490 def __init__(self, doc, typemap, default=None, optional=False, multi=False, deprecated=None):
491 source = getStackFrame()
492 self._setup(
493 doc=doc,
494 dtype=self.instanceDictClass,
495 default=default,
496 check=None,
497 optional=optional,
498 source=source,
499 deprecated=deprecated,
500 )
501 self.typemap = typemap
502 self.multi = multi
503

Member Function Documentation

◆ __class_getitem__()

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

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

Definition at line 504 of file configChoiceField.py.

504 def __class_getitem__(cls, params: tuple[type, ...] | type | ForwardRef):
505 raise ValueError("ConfigChoiceField does not support typing argument")
506

◆ __deepcopy__()

lsst.pex.config.configChoiceField.ConfigChoiceField.__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!

Reimplemented in lsst.pex.config.registry.RegistryField.

Definition at line 606 of file configChoiceField.py.

606 def __deepcopy__(self, memo):
607 """Customize deep-copying, because we always want a reference to the
608 original typemap.
609
610 WARNING: this must be overridden by subclasses if they change the
611 constructor signature!
612 """
613 other = type(self)(
614 doc=self.doc,
615 typemap=self.typemap,
616 default=copy.deepcopy(self.default),
617 optional=self.optional,
618 multi=self.multi,
619 )
620 other.source = self.source
621 return other
622

◆ __get__() [1/3]

ConfigInstanceDict lsst.pex.config.configChoiceField.ConfigChoiceField.__get__ ( self,
Config instance,
Any owner = None,
Any at = None,
str label = "default" )

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

Definition at line 525 of file configChoiceField.py.

527 ) -> ConfigInstanceDict: ...
528

◆ __get__() [2/3]

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

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

Definition at line 529 of file configChoiceField.py.

529 def __get__(self, instance, owner=None, at=None, label="default"):
530 if instance is None or not isinstance(instance, Config):
531 return self
532 else:
533 return self._getOrMake(instance)
534

◆ __get__() [3/3]

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

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

Definition at line 520 of file configChoiceField.py.

522 ) -> ConfigChoiceField: ...
523

◆ __set__()

None lsst.pex.config.configChoiceField.ConfigChoiceField.__set__ ( self,
Config instance,
ConfigInstanceDict | None value,
Any at = None,
str label = "assignment" )
Set an attribute on the config instance.

Parameters
----------
instance : `lsst.pex.config.Config`
    The config instance that contains this field.
value : obj
    Value to set on this field.
at : `list` of `~lsst.pex.config.callStack.StackFrame` or `None`,\
        optional
    The call stack (created by
    `lsst.pex.config.callStack.getCallStack`).
label : `str`, optional
    Event label for the history.

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

Derived `~lsst.pex.config.Field` classes may need to override the
behavior. When overriding ``__set__``, `~lsst.pex.config.Field` authors
should follow the following rules:

- Do not allow modification of frozen configs.
- Validate the new value **before** modifying the field. Except if the
  new value is `None`. `None` is special and no attempt should be made
  to validate it until `lsst.pex.config.Config.validate` is called.
- Do not modify the `~lsst.pex.config.Config` instance to contain
  invalid values.
- If the field is modified, update the history of the
  `lsst.pex.config.field.Field` to reflect the changes.

In order to decrease the need to implement this method in derived
`~lsst.pex.config.Field` types, value validation is performed in the
`lsst.pex.config.Field._validateValue`. If only the validation step
differs in the derived `~lsst.pex.config.Field`, it is simpler to
implement `lsst.pex.config.Field._validateValue` than to reimplement
``__set__``. More complicated behavior, however, may require
reimplementation.

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

Definition at line 535 of file configChoiceField.py.

537 ) -> None:
538 if instance._frozen:
539 raise FieldValidationError(self, instance, "Cannot modify a frozen Config")
540 if at is None:
541 at = getCallStack()
542 instanceDict = self._getOrMake(instance)
543 if isinstance(value, self.instanceDictClass):
544 for k, v in value.items():
545 instanceDict.__setitem__(k, v, at=at, label=label)
546 instanceDict._setSelection(value._selection, at=at, label=label)
547
548 else:
549 instanceDict._setSelection(value, at=at, label=label)
550

◆ _collectImports()

lsst.pex.config.configChoiceField.ConfigChoiceField._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 590 of file configChoiceField.py.

590 def _collectImports(self, instance, imports):
591 instanceDict = self.__get__(instance)
592 for config in instanceDict.values():
593 config._collectImports()
594 imports |= config._imports
595

◆ _compare()

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

Used by `lsst.pex.ConfigChoiceField.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.

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

Notes
-----
Only the selected configurations are compared, as the parameters of any
others do not matter.

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

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

Definition at line 623 of file configChoiceField.py.

623 def _compare(self, instance1, instance2, shortcut, rtol, atol, output):
624 """Compare two fields for equality.
625
626 Used by `lsst.pex.ConfigChoiceField.compare`.
627
628 Parameters
629 ----------
630 instance1 : `lsst.pex.config.Config`
631 Left-hand side config instance to compare.
632 instance2 : `lsst.pex.config.Config`
633 Right-hand side config instance to compare.
634 shortcut : `bool`
635 If `True`, this function returns as soon as an inequality if found.
636 rtol : `float`
637 Relative tolerance for floating point comparisons.
638 atol : `float`
639 Absolute tolerance for floating point comparisons.
640 output : callable
641 A callable that takes a string, used (possibly repeatedly) to
642 report inequalities.
643
644 Returns
645 -------
646 isEqual : bool
647 `True` if the fields are equal, `False` otherwise.
648
649 Notes
650 -----
651 Only the selected configurations are compared, as the parameters of any
652 others do not matter.
653
654 Floating point comparisons are performed by `numpy.allclose`.
655 """
656 d1 = getattr(instance1, self.name)
657 d2 = getattr(instance2, self.name)
658 name = getComparisonName(
659 _joinNamePath(instance1._name, self.name), _joinNamePath(instance2._name, self.name)
660 )
661 if not compareScalars("selection for %s" % name, d1._selection, d2._selection, output=output):
662 return False
663 if d1._selection is None:
664 return True
665 if self.multi:
666 nested = [(k, d1[k], d2[k]) for k in d1._selection]
667 else:
668 nested = [(d1._selection, d1[d1._selection], d2[d1._selection])]
669 equal = True
670 for k, c1, c2 in nested:
671 result = compareConfigs(
672 f"{name}[{k!r}]", c1, c2, shortcut=shortcut, rtol=rtol, atol=atol, output=output
673 )
674 if not result and shortcut:
675 return False
676 equal = equal and result
677 return equal

◆ _getOrMake()

lsst.pex.config.configChoiceField.ConfigChoiceField._getOrMake ( self,
instance,
label = "default" )
protected

Definition at line 507 of file configChoiceField.py.

507 def _getOrMake(self, instance, label="default"):
508 instanceDict = instance._storage.get(self.name)
509 if instanceDict is None:
510 at = getCallStack(1)
511 instanceDict = self.dtype(instance, self)
512 instanceDict.__doc__ = self.doc
513 instance._storage[self.name] = instanceDict
514 history = instance._history.setdefault(self.name, [])
515 history.append(("Initialized from defaults", at, label))
516
517 return instanceDict
518

◆ freeze()

lsst.pex.config.configChoiceField.ConfigChoiceField.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 584 of file configChoiceField.py.

584 def freeze(self, instance):
585 instanceDict = self.__get__(instance)
586 instanceDict.freeze()
587 for v in instanceDict.values():
588 v.freeze()
589

◆ rename()

lsst.pex.config.configChoiceField.ConfigChoiceField.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 551 of file configChoiceField.py.

551 def rename(self, instance):
552 instanceDict = self.__get__(instance)
553 fullname = _joinNamePath(instance._name, self.name)
554 instanceDict._rename(fullname)
555

◆ save()

lsst.pex.config.configChoiceField.ConfigChoiceField.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 596 of file configChoiceField.py.

596 def save(self, outfile, instance):
597 instanceDict = self.__get__(instance)
598 fullname = _joinNamePath(instance._name, self.name)
599 for v in instanceDict.values():
600 v._save(outfile)
601 if self.multi:
602 outfile.write(f"{fullname}.names={sorted(instanceDict.names)!r}\n")
603 else:
604 outfile.write(f"{fullname}.name={instanceDict.name!r}\n")
605

◆ toDict()

lsst.pex.config.configChoiceField.ConfigChoiceField.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 568 of file configChoiceField.py.

568 def toDict(self, instance):
569 instanceDict = self.__get__(instance)
570
571 dict_ = {}
572 if self.multi:
573 dict_["names"] = instanceDict.names
574 else:
575 dict_["name"] = instanceDict.name
576
577 values = {}
578 for k, v in instanceDict.items():
579 values[k] = v.toDict()
580 dict_["values"] = values
581
582 return dict_
583

◆ validate()

lsst.pex.config.configChoiceField.ConfigChoiceField.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 556 of file configChoiceField.py.

556 def validate(self, instance):
557 instanceDict = self.__get__(instance)
558 if instanceDict.active is None and not self.optional:
559 msg = "Required field cannot be None"
560 raise FieldValidationError(self, instance, msg)
561 elif instanceDict.active is not None:
562 if self.multi:
563 for a in instanceDict.active:
564 a.validate()
565 else:
566 instanceDict.active.validate()
567

Member Data Documentation

◆ instanceDictClass

lsst.pex.config.configChoiceField.ConfigChoiceField.instanceDictClass = ConfigInstanceDict
static

Definition at line 488 of file configChoiceField.py.

◆ multi

lsst.pex.config.configChoiceField.ConfigChoiceField.multi

Definition at line 502 of file configChoiceField.py.

◆ name

lsst.pex.config.configChoiceField.ConfigChoiceField.name

Definition at line 659 of file configChoiceField.py.

◆ typemap

lsst.pex.config.configChoiceField.ConfigChoiceField.typemap

Definition at line 501 of file configChoiceField.py.


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