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.dictField.DictField Class Reference
Inheritance diagram for lsst.pex.config.dictField.DictField:
lsst.pex.config.config.Field lsst.pex.config.configDictField.ConfigDictField

Public Member Functions

def __init__ (self, doc, keytype, itemtype, default=None, optional=False, dictCheck=None, itemCheck=None, deprecated=None)
 
def validate (self, instance)
 
def __set__ (self, instance, value, at=None, label="assignment")
 
def toDict (self, instance)
 
def rename (self, instance)
 
def freeze (self, instance)
 
def save (self, outfile, instance)
 
def __get__ (self, instance, owner=None, at=None, label="default")
 
def __delete__ (self, instance, at=None, label='deletion')
 

Public Attributes

 keytype
 
 itemtype
 
 dictCheck
 
 itemCheck
 
 dtype
 
 doc
 
 deprecated
 
 default
 
 check
 
 optional
 
 source
 

Static Public Attributes

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

Detailed Description

A configuration field (`~lsst.pex.config.Field` subclass) that maps keys
and values.

The types of both items and keys are restricted to these builtin types:
`int`, `float`, `complex`, `bool`, and `str`). All keys share the same type
and all values share the same type. Keys can have a different type from
values.

Parameters
----------
doc : `str`
    A documentation string that describes the configuration field.
keytype : {`int`, `float`, `complex`, `bool`, `str`}
    The type of the mapping keys. All keys must have this type.
itemtype : {`int`, `float`, `complex`, `bool`, `str`}
    Type of the mapping values.
default : `dict`, optional
    The default mapping.
optional : `bool`, optional
    If `True`, the field doesn't need to have a set value.
dictCheck : callable
    A function that validates the dictionary as a whole.
itemCheck : callable
    A function that validates individual mapping values.
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
ConfigurableField
Field
ListField
RangeField
RegistryField

Examples
--------
This field maps has `str` keys and `int` values:

>>> from lsst.pex.config import Config, DictField
>>> class MyConfig(Config):
...     field = DictField(
...         doc="Example string-to-int mapping field.",
...         keytype=str, itemtype=int,
...         default={})
...
>>> config = MyConfig()
>>> config.field['myKey'] = 42
>>> print(config.field)
{'myKey': 42}

Definition at line 153 of file dictField.py.

Constructor & Destructor Documentation

◆ __init__()

def lsst.pex.config.dictField.DictField.__init__ (   self,
  doc,
  keytype,
  itemtype,
  default = None,
  optional = False,
  dictCheck = None,
  itemCheck = None,
  deprecated = None 
)

Reimplemented in lsst.pex.config.configDictField.ConfigDictField.

Definition at line 213 of file dictField.py.

214  deprecated=None):
215  source = getStackFrame()
216  self._setup(doc=doc, dtype=Dict, default=default, check=None,
217  optional=optional, source=source, deprecated=deprecated)
218  if keytype not in self.supportedTypes:
219  raise ValueError("'keytype' %s is not a supported type" %
220  _typeStr(keytype))
221  elif itemtype is not None and itemtype not in self.supportedTypes:
222  raise ValueError("'itemtype' %s is not a supported type" %
223  _typeStr(itemtype))
224  if dictCheck is not None and not hasattr(dictCheck, "__call__"):
225  raise ValueError("'dictCheck' must be callable")
226  if itemCheck is not None and not hasattr(itemCheck, "__call__"):
227  raise ValueError("'itemCheck' must be callable")
228 
229  self.keytype = keytype
230  self.itemtype = itemtype
231  self.dictCheck = dictCheck
232  self.itemCheck = itemCheck
233 
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__()

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.dictField.DictField.__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.

Definition at line 267 of file dictField.py.

267  def __set__(self, instance, value, at=None, label="assignment"):
268  if instance._frozen:
269  msg = "Cannot modify a frozen Config. "\
270  "Attempting to set field to value %s" % value
271  raise FieldValidationError(self, instance, msg)
272 
273  if at is None:
274  at = getCallStack()
275  if value is not None:
276  value = self.DictClass(instance, self, value, at=at, label=label)
277  else:
278  history = instance._history.setdefault(self.name, [])
279  history.append((value, at, label))
280 
281  instance._storage[self.name] = value
282 

◆ freeze()

def lsst.pex.config.config.Field.freeze (   self,
  instance 
)
inherited
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 in lsst.pipe.tasks.configurableActions._configurableActionStructField.ConfigurableActionStructField, lsst.pex.config.configurableField.ConfigurableField, lsst.pex.config.configField.ConfigField, lsst.pex.config.configDictField.ConfigDictField, and lsst.pex.config.configChoiceField.ConfigChoiceField.

Definition at line 429 of file config.py.

429  def freeze(self, instance):
430  """Make this field read-only (for internal use only).
431 
432  Parameters
433  ----------
434  instance : `lsst.pex.config.Config`
435  The config instance that contains this field.
436 
437  Notes
438  -----
439  Freezing is only relevant for fields that hold subconfigs. Fields which
440  hold subconfigs should freeze each subconfig.
441 
442  **Subclasses should implement this method.**
443  """
444  pass
445 

◆ rename()

def lsst.pex.config.config.Field.rename (   self,
  instance 
)
inherited
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 in lsst.pex.config.configurableField.ConfigurableField, lsst.pex.config.configField.ConfigField, lsst.pex.config.configDictField.ConfigDictField, and lsst.pex.config.configChoiceField.ConfigChoiceField.

Definition at line 379 of file config.py.

379  def rename(self, instance):
380  """Rename the field in a `~lsst.pex.config.Config` (for internal use
381  only).
382 
383  Parameters
384  ----------
385  instance : `lsst.pex.config.Config`
386  The config instance that contains this field.
387 
388  Notes
389  -----
390  This method is invoked by the `lsst.pex.config.Config` object that
391  contains this field and should not be called directly.
392 
393  Renaming is only relevant for `~lsst.pex.config.Field` instances that
394  hold subconfigs. `~lsst.pex.config.Fields` that hold subconfigs should
395  rename each subconfig with the full field name as generated by
396  `lsst.pex.config.config._joinNamePath`.
397  """
398  pass
399 

◆ save()

def lsst.pex.config.config.Field.save (   self,
  outfile,
  instance 
)
inherited
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 in lsst.pipe.tasks.configurableActions._configurableActionStructField.ConfigurableActionStructField, lsst.pex.config.configurableField.ConfigurableField, lsst.pex.config.configField.ConfigField, lsst.pex.config.configDictField.ConfigDictField, and lsst.pex.config.configChoiceField.ConfigChoiceField.

Definition at line 487 of file config.py.

487  def save(self, outfile, instance):
488  """Save this field to a file (for internal use only).
489 
490  Parameters
491  ----------
492  outfile : file-like object
493  A writeable field handle.
494  instance : `Config`
495  The `Config` instance that contains this field.
496 
497  Notes
498  -----
499  This method is invoked by the `~lsst.pex.config.Config` object that
500  contains this field and should not be called directly.
501 
502  The output consists of the documentation string
503  (`lsst.pex.config.Field.doc`) formatted as a Python comment. The second
504  line is formatted as an assignment: ``{fullname}={value}``.
505 
506  This output can be executed with Python.
507  """
508  value = self.__get__(instance)
509  fullname = _joinNamePath(instance._name, self.name)
510 
511  if self.deprecated and value == self.default:
512  return
513 
514  # write full documentation string as comment lines
515  # (i.e. first character is #)
516  doc = "# " + str(self.doc).replace("\n", "\n# ")
517  if isinstance(value, float) and not math.isfinite(value):
518  # non-finite numbers need special care
519  outfile.write(u"{}\n{}=float('{!r}')\n\n".format(doc, fullname, value))
520  else:
521  outfile.write(u"{}\n{}={!r}\n\n".format(doc, fullname, value))
522 
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174

◆ toDict()

def lsst.pex.config.dictField.DictField.toDict (   self,
  instance 
)
Convert this field's key-value pairs into a regular `dict`.

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

Returns
-------
result : `dict` or `None`
    If this field has a value of `None`, then this method returns
    `None`. Otherwise, this method returns the field's value as a
    regular Python `dict`.

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

Reimplemented in lsst.pex.config.configDictField.ConfigDictField.

Definition at line 283 of file dictField.py.

283  def toDict(self, instance):
284  """Convert this field's key-value pairs into a regular `dict`.
285 
286  Parameters
287  ----------
288  instance : `lsst.pex.config.Config`
289  The configuration that contains this field.
290 
291  Returns
292  -------
293  result : `dict` or `None`
294  If this field has a value of `None`, then this method returns
295  `None`. Otherwise, this method returns the field's value as a
296  regular Python `dict`.
297  """
298  value = self.__get__(instance)
299  return dict(value) if value is not None else None
300 

◆ validate()

def lsst.pex.config.dictField.DictField.validate (   self,
  instance 
)
Validate the field's value (for internal use only).

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

Returns
-------
isValid : `bool`
    `True` is returned if the field passes validation criteria (see
    *Notes*). Otherwise `False`.

Notes
-----
This method validates values according to the following criteria:

- A non-optional field is not `None`.
- If a value is not `None`, is must pass the `ConfigField.dictCheck`
  user callback functon.

Individual item checks by the `ConfigField.itemCheck` user callback
function are done immediately when the value is set on a key. Those
checks are not repeated by this method.

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

Reimplemented in lsst.pex.config.configDictField.ConfigDictField.

Definition at line 234 of file dictField.py.

234  def validate(self, instance):
235  """Validate the field's value (for internal use only).
236 
237  Parameters
238  ----------
239  instance : `lsst.pex.config.Config`
240  The configuration that contains this field.
241 
242  Returns
243  -------
244  isValid : `bool`
245  `True` is returned if the field passes validation criteria (see
246  *Notes*). Otherwise `False`.
247 
248  Notes
249  -----
250  This method validates values according to the following criteria:
251 
252  - A non-optional field is not `None`.
253  - If a value is not `None`, is must pass the `ConfigField.dictCheck`
254  user callback functon.
255 
256  Individual item checks by the `ConfigField.itemCheck` user callback
257  function are done immediately when the value is set on a key. Those
258  checks are not repeated by this method.
259  """
260  Field.validate(self, instance)
261  value = self.__get__(instance)
262  if value is not None and self.dictCheck is not None \
263  and not self.dictCheck(value):
264  msg = "%s is not a valid value" % str(value)
265  raise FieldValidationError(self, instance, msg)
266 

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.

◆ dictCheck

lsst.pex.config.dictField.DictField.dictCheck

Definition at line 231 of file dictField.py.

◆ DictClass

lsst.pex.config.dictField.DictField.DictClass = Dict
static

Definition at line 211 of file dictField.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.

◆ itemCheck

lsst.pex.config.dictField.DictField.itemCheck

Definition at line 232 of file dictField.py.

◆ itemtype

lsst.pex.config.dictField.DictField.itemtype

Definition at line 230 of file dictField.py.

◆ keytype

lsst.pex.config.dictField.DictField.keytype

Definition at line 229 of file dictField.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: