LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
lsst.pex.config.configField.ConfigField Class Reference
Inheritance diagram for lsst.pex.config.configField.ConfigField:
lsst.pex.config.config.Field lsst.pipe.tasks.configurableActions._configurableActionField.ConfigurableActionField

Public Member Functions

def __init__ (self, doc, dtype, default=None, check=None, deprecated=None)
 
def __get__ (self, instance, owner=None)
 
def __set__ (self, instance, value, at=None, label="assignment")
 
def rename (self, instance)
 
def save (self, outfile, instance)
 
def freeze (self, instance)
 
def toDict (self, instance)
 
def validate (self, instance)
 
def __get__ (self, instance, owner=None, at=None, label="default")
 
def __delete__ (self, instance, at=None, label='deletion')
 

Public Attributes

 dtype
 
 doc
 
 deprecated
 
 default
 
 check
 
 optional
 
 source
 

Static Public Attributes

 supportedTypes = set((str, bool, float, int, complex))
 

Detailed Description

A configuration field (`~lsst.pex.config.Field` subclass) that takes a
`~lsst.pex.config.Config`-type as a value.

Parameters
----------
doc : `str`
    A description of the configuration field.
dtype : `lsst.pex.config.Config`-type
    The type of the field, which must be a subclass of
    `lsst.pex.config.Config`.
default : `lsst.pex.config.Config`, optional
    If default is `None`, the field will default to a default-constructed
    instance of ``dtype``. Additionally, to allow for fewer deep-copies,
    assigning an instance of ``ConfigField`` to ``dtype`` itself, is
    considered equivalent to assigning a default-constructed sub-config.
    This means that the argument default can be ``dtype``, as well as an
    instance of ``dtype``.
check : callable, optional
    A callback function that validates the field's value, returning `True`
    if the value 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
ConfigurableField
DictField
Field
ListField
RangeField
RegistryField

Notes
-----
The behavior of this type of field is much like that of the base `Field`
type.

Assigning to ``ConfigField`` will update all of the fields in the
configuration.

Definition at line 35 of file configField.py.

Constructor & Destructor Documentation

◆ __init__()

def lsst.pex.config.configField.ConfigField.__init__ (   self,
  doc,
  dtype,
  default = None,
  check = None,
  deprecated = None 
)

Reimplemented in lsst.pipe.tasks.configurableActions._configurableActionField.ConfigurableActionField.

Definition at line 81 of file configField.py.

81  def __init__(self, doc, dtype, default=None, check=None, deprecated=None):
82  if not issubclass(dtype, Config):
83  raise ValueError("dtype=%s is not a subclass of Config" %
84  _typeStr(dtype))
85  if default is None:
86  default = dtype
87  source = getStackFrame()
88  self._setup(doc=doc, dtype=dtype, default=default, check=check,
89  optional=False, source=source, deprecated=deprecated)
90 
def getStackFrame(relative=0)
Definition: callStack.py:58

Member Function Documentation

◆ __delete__()

def 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 634 of file config.py.

634  def __delete__(self, instance, at=None, label='deletion'):
635  """Delete an attribute from a `lsst.pex.config.Config` instance.
636 
637  Parameters
638  ----------
639  instance : `lsst.pex.config.Config`
640  The config instance that contains this field.
641  at : `list` of `lsst.pex.config.callStack.StackFrame`
642  The call stack (created by
643  `lsst.pex.config.callStack.getCallStack`).
644  label : `str`, optional
645  Event label for the history.
646 
647  Notes
648  -----
649  This is invoked by the owning `~lsst.pex.config.Config` object and
650  should not be called directly.
651  """
652  if at is None:
653  at = getCallStack()
654  self.__set__(instance, None, at=at, label=label)
655 
def getCallStack(skip=0)
Definition: callStack.py:175

◆ __get__() [1/2]

def lsst.pex.config.configField.ConfigField.__get__ (   self,
  instance,
  owner = None 
)

Definition at line 91 of file configField.py.

91  def __get__(self, instance, owner=None):
92  if instance is None or not isinstance(instance, Config):
93  return self
94  else:
95  value = instance._storage.get(self.name, None)
96  if value is None:
97  at = getCallStack()
98  at.insert(0, self.source)
99  self.__set__(instance, self.default, at=at, label="default")
100  return value
101 

◆ __get__() [2/2]

def lsst.pex.config.config.Field.__get__ (   self,
  instance,
  owner = None,
  at = None,
  label = "default" 
)
inherited
Define how attribute access should occur on the Config instance
This is invoked by the owning config object and should not be called
directly

When the field attribute is accessed on a Config class object, it
returns the field object itself in order to allow inspection of
Config classes.

When the field attribute is access on a config instance, the actual
value described by the field (and held by the Config instance) is
returned.

Reimplemented in lsst.pex.config.configurableField.ConfigurableField.

Definition at line 550 of file config.py.

550  def __get__(self, instance, owner=None, at=None, label="default"):
551  """Define how attribute access should occur on the Config instance
552  This is invoked by the owning config object and should not be called
553  directly
554 
555  When the field attribute is accessed on a Config class object, it
556  returns the field object itself in order to allow inspection of
557  Config classes.
558 
559  When the field attribute is access on a config instance, the actual
560  value described by the field (and held by the Config instance) is
561  returned.
562  """
563  if instance is None:
564  return self
565  else:
566  # try statements are almost free in python if they succeed
567  try:
568  return instance._storage[self.name]
569  except AttributeError:
570  if not isinstance(instance, Config):
571  return self
572  else:
573  raise AttributeError(f"Config {instance} is missing "
574  "_storage attribute, likely"
575  " incorrectly initialized")
576 

◆ __set__()

def lsst.pex.config.configField.ConfigField.__set__ (   self,
  instance,
  value,
  at = None,
  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`
    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.

Reimplemented in lsst.pipe.tasks.configurableActions._configurableActionField.ConfigurableActionField.

Definition at line 102 of file configField.py.

102  def __set__(self, instance, value, at=None, label="assignment"):
103  if instance._frozen:
104  raise FieldValidationError(self, instance,
105  "Cannot modify a frozen Config")
106  name = _joinNamePath(prefix=instance._name, name=self.name)
107 
108  if value != self.dtype and type(value) != self.dtype:
109  msg = "Value %s is of incorrect type %s. Expected %s" % \
110  (value, _typeStr(value), _typeStr(self.dtype))
111  raise FieldValidationError(self, instance, msg)
112 
113  if at is None:
114  at = getCallStack()
115 
116  oldValue = instance._storage.get(self.name, None)
117  if oldValue is None:
118  if value == self.dtype:
119  instance._storage[self.name] = self.dtype(__name=name, __at=at, __label=label)
120  else:
121  instance._storage[self.name] = self.dtype(__name=name, __at=at,
122  __label=label, **value._storage)
123  else:
124  if value == self.dtype:
125  value = value()
126  oldValue.update(__at=at, __label=label, **value._storage)
127  history = instance._history.setdefault(self.name, [])
128  history.append(("config value set", at, label))
129 
table::Key< int > type
Definition: Detector.cc:163

◆ freeze()

def lsst.pex.config.configField.ConfigField.freeze (   self,
  instance 
)
Make this field read-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 181 of file configField.py.

181  def freeze(self, instance):
182  """Make this field read-only.
183 
184  Parameters
185  ----------
186  instance : `lsst.pex.config.Config`
187  The config instance that contains this field.
188 
189  Notes
190  -----
191  Freezing is only relevant for fields that hold subconfigs. Fields which
192  hold subconfigs should freeze each subconfig.
193 
194  **Subclasses should implement this method.**
195  """
196  value = self.__get__(instance)
197  value.freeze()
198 

◆ rename()

def lsst.pex.config.configField.ConfigField.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.Fields` 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 130 of file configField.py.

130  def rename(self, instance):
131  """Rename the field in a `~lsst.pex.config.Config` (for internal use
132  only).
133 
134  Parameters
135  ----------
136  instance : `lsst.pex.config.Config`
137  The config instance that contains this field.
138 
139  Notes
140  -----
141  This method is invoked by the `lsst.pex.config.Config` object that
142  contains this field and should not be called directly.
143 
144  Renaming is only relevant for `~lsst.pex.config.Field` instances that
145  hold subconfigs. `~lsst.pex.config.Fields` that hold subconfigs should
146  rename each subconfig with the full field name as generated by
147  `lsst.pex.config.config._joinNamePath`.
148  """
149  value = self.__get__(instance)
150  value._rename(_joinNamePath(instance._name, self.name))
151 

◆ save()

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

Parameters
----------
outfile : file-like object
    A writeable field handle.
instance : `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.

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 157 of file configField.py.

157  def save(self, outfile, instance):
158  """Save this field to a file (for internal use only).
159 
160  Parameters
161  ----------
162  outfile : file-like object
163  A writeable field handle.
164  instance : `Config`
165  The `Config` instance that contains this field.
166 
167  Notes
168  -----
169  This method is invoked by the `~lsst.pex.config.Config` object that
170  contains this field and should not be called directly.
171 
172  The output consists of the documentation string
173  (`lsst.pex.config.Field.doc`) formatted as a Python comment. The second
174  line is formatted as an assignment: ``{fullname}={value}``.
175 
176  This output can be executed with Python.
177  """
178  value = self.__get__(instance)
179  value._save(outfile)
180 

◆ toDict()

def lsst.pex.config.configField.ConfigField.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 : `Config`
    The `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 199 of file configField.py.

199  def toDict(self, instance):
200  """Convert the field value so that it can be set as the value of an
201  item in a `dict` (for internal use only).
202 
203  Parameters
204  ----------
205  instance : `Config`
206  The `Config` that contains this field.
207 
208  Returns
209  -------
210  value : object
211  The field's value. See *Notes*.
212 
213  Notes
214  -----
215  This method invoked by the owning `~lsst.pex.config.Config` object and
216  should not be called directly.
217 
218  Simple values are passed through. Complex data structures must be
219  manipulated. For example, a `~lsst.pex.config.Field` holding a
220  subconfig should, instead of the subconfig object, return a `dict`
221  where the keys are the field names in the subconfig, and the values are
222  the field values in the subconfig.
223  """
224  value = self.__get__(instance)
225  return value.toDict()
226 

◆ validate()

def lsst.pex.config.configField.ConfigField.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.Field.validate` if they re-implement
`~lsst.pex.config.field.Field.validate`.

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

Definition at line 227 of file configField.py.

227  def validate(self, instance):
228  """Validate the field (for internal use only).
229 
230  Parameters
231  ----------
232  instance : `lsst.pex.config.Config`
233  The config instance that contains this field.
234 
235  Raises
236  ------
237  lsst.pex.config.FieldValidationError
238  Raised if verification fails.
239 
240  Notes
241  -----
242  This method provides basic validation:
243 
244  - Ensures that the value is not `None` if the field is not optional.
245  - Ensures type correctness.
246  - Ensures that the user-provided ``check`` function is valid.
247 
248  Most `~lsst.pex.config.Field` subclasses should call
249  `lsst.pex.config.field.Field.validate` if they re-implement
250  `~lsst.pex.config.field.Field.validate`.
251  """
252  value = self.__get__(instance)
253  value.validate()
254 
255  if self.check is not None and not self.check(value):
256  msg = "%s is not a valid value" % str(value)
257  raise FieldValidationError(self, instance, msg)
258 

Member Data Documentation

◆ check

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

Definition at line 363 of file config.py.

◆ default

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

Definition at line 359 of file config.py.

◆ deprecated

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

Definition at line 350 of file config.py.

◆ doc

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

Definition at line 346 of file config.py.

◆ dtype

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

Definition at line 339 of file config.py.

◆ optional

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

Definition at line 367 of file config.py.

◆ source

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

Definition at line 374 of file config.py.

◆ supportedTypes

lsst.pex.config.config.Field.supportedTypes = set((str, bool, float, int, complex))
staticinherited

Definition at line 324 of file config.py.


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