LSSTApplications  19.0.0-14-gb0260a2+2d714fc2ef,20.0.0+34a42eae2c,20.0.0+76f397ef0c,20.0.0+8558dd3f48,20.0.0+a6b6977b51,20.0.0+b2ea66fa67,20.0.0+cc669a8b45,20.0.0+d561663fb5,20.0.0+d778e99126,20.0.0+efe67588cf,20.0.0+f45b7d88f4,20.0.0+f7c597f720,20.0.0+fb43bee9b9,20.0.0+fb4d547e0d,20.0.0-1-g10df615+d8b88ec1b5,20.0.0-1-g253301a+a6b6977b51,20.0.0-1-g498fb60+ff88705a28,20.0.0-1-g4d801e7+ce0d01dabd,20.0.0-1-g5b95a8c+24eaf908b3,20.0.0-1-g8a53f90+2817c06967,20.0.0-1-gc96f8cb+fb4d547e0d,20.0.0-1-gd1c87d7+2817c06967,20.0.0-1-gdb27ee5+abab67204f,20.0.0-13-ge998c5c+9f8c516ffa,20.0.0-18-g08fba245+88079d2923,20.0.0-2-gec03fae+fb98bf9d97,20.0.0-3-gdd5c15c+a61313b210,20.0.0-34-gdb4d86a+b43b2c05ff,20.0.0-4-g4a2362f+f45b7d88f4,20.0.0-4-gfea843c+f45b7d88f4,20.0.0-5-gac0d578b1+a8c4e2ada3,20.0.0-5-gfcebe35+cfceff6a24,20.0.0-6-g01203fff+e332440eaf,20.0.0-8-gea2affd+48c001ce3c,20.0.0-9-gabd0d4c+abab67204f,20.0.0-9-gf3ab18e+fb4d547e0d,w.2020.33
LSSTDataManagementBasePackage
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
pex.config.config.Field Class Reference
Inheritance diagram for pex.config.config.Field:
pex.config.choiceField.ChoiceField pex.config.configChoiceField.ConfigChoiceField pex.config.configField.ConfigField pex.config.configurableField.ConfigurableField pex.config.dictField.DictField pex.config.listField.ListField pex.config.rangeField.RangeField pex.config.registry.RegistryField pex.config.configDictField.ConfigDictField

Public Member Functions

def __init__ (self, doc, dtype, default=None, check=None, optional=False, deprecated=None)
 
def rename (self, instance)
 
def validate (self, instance)
 
def freeze (self, instance)
 
def save (self, outfile, instance)
 
def toDict (self, instance)
 
def __get__ (self, instance, owner=None, at=None, label="default")
 
def __set__ (self, instance, value, at=None, label='assignment')
 
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 field in a `~lsst.pex.config.Config` that supports `int`, `float`,
`complex`, `bool`, and `str` data types.

Parameters
----------
doc : `str`
    A description of the field for users.
dtype : type
    The field's data type. ``Field`` only supports basic data types:
    `int`, `float`, `complex`, `bool`, and `str`. See
    `Field.supportedTypes`.
default : object, optional
    The field's default value.
check : callable, optional
    A callable that is called with the field's value. This callable should
    return `False` if the value is invalid. More complex inter-field
    validation can be written as part of the
    `lsst.pex.config.Config.validate` method.
optional : `bool`, optional
    This sets whether the field is considered optional, and therefore
    doesn't need to be set by the user. When `False`,
    `lsst.pex.config.Config.validate` fails if the field's value is `None`.
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.

Raises
------
ValueError
    Raised when the ``dtype`` parameter is not one of the supported types
    (see `Field.supportedTypes`).

See also
--------
ChoiceField
ConfigChoiceField
ConfigDictField
ConfigField
ConfigurableField
DictField
ListField
RangeField
RegistryField

Notes
-----
``Field`` instances (including those of any subclass of ``Field``) are used
as class attributes of `~lsst.pex.config.Config` subclasses (see the
example, below). ``Field`` attributes work like the `property` attributes
of classes that implement custom setters and getters. `Field` attributes
belong to the class, but operate on the instance. Formally speaking,
`Field` attributes are `descriptors
<https://docs.python.org/3/howto/descriptor.html>`_.

When you access a `Field` attribute on a `Config` instance, you don't
get the `Field` instance itself. Instead, you get the value of that field,
which might be a simple type (`int`, `float`, `str`, `bool`) or a custom
container type (like a `lsst.pex.config.List`) depending on the field's
type. See the example, below.

Examples
--------
Instances of ``Field`` should be used as class attributes of
`lsst.pex.config.Config` subclasses:

>>> from lsst.pex.config import Config, Field
>>> class Example(Config):
...     myInt = Field("An integer field.", int, default=0)
...
>>> print(config.myInt)
0
>>> config.myInt = 5
>>> print(config.myInt)
5

Definition at line 195 of file config.py.

Constructor & Destructor Documentation

◆ __init__()

def pex.config.config.Field.__init__ (   self,
  doc,
  dtype,
  default = None,
  check = None,
  optional = False,
  deprecated = None 
)

Reimplemented in pex.config.configChoiceField.ConfigChoiceField, pex.config.configurableField.ConfigurableField, and pex.config.choiceField.ChoiceField.

Definition at line 276 of file config.py.

276  def __init__(self, doc, dtype, default=None, check=None, optional=False, deprecated=None):
277  if dtype not in self.supportedTypes:
278  raise ValueError("Unsupported Field dtype %s" % _typeStr(dtype))
279 
280  source = getStackFrame()
281  self._setup(doc=doc, dtype=dtype, default=default, check=check, optional=optional, source=source,
282  deprecated=deprecated)
283 

Member Function Documentation

◆ __delete__()

def pex.config.config.Field.__delete__ (   self,
  instance,
  at = None,
  label = 'deletion' 
)
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 573 of file config.py.

573  def __delete__(self, instance, at=None, label='deletion'):
574  """Delete an attribute from a `lsst.pex.config.Config` instance.
575 
576  Parameters
577  ----------
578  instance : `lsst.pex.config.Config`
579  The config instance that contains this field.
580  at : `list` of `lsst.pex.config.callStack.StackFrame`
581  The call stack (created by
582  `lsst.pex.config.callStack.getCallStack`).
583  label : `str`, optional
584  Event label for the history.
585 
586  Notes
587  -----
588  This is invoked by the owning `~lsst.pex.config.Config` object and
589  should not be called directly.
590  """
591  if at is None:
592  at = getCallStack()
593  self.__set__(instance, None, at=at, label=label)
594 

◆ __get__()

def pex.config.config.Field.__get__ (   self,
  instance,
  owner = None,
  at = None,
  label = "default" 
)
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 pex.config.configurableField.ConfigurableField.

Definition at line 498 of file config.py.

498  def __get__(self, instance, owner=None, at=None, label="default"):
499  """Define how attribute access should occur on the Config instance
500  This is invoked by the owning config object and should not be called
501  directly
502 
503  When the field attribute is accessed on a Config class object, it
504  returns the field object itself in order to allow inspection of
505  Config classes.
506 
507  When the field attribute is access on a config instance, the actual
508  value described by the field (and held by the Config instance) is
509  returned.
510  """
511  if instance is None or not isinstance(instance, Config):
512  return self
513  else:
514  return instance._storage[self.name]
515 

◆ __set__()

def pex.config.config.Field.__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 in pex.config.configChoiceField.ConfigChoiceField, pex.config.listField.ListField, pex.config.configurableField.ConfigurableField, pex.config.dictField.DictField, and pex.config.configField.ConfigField.

Definition at line 516 of file config.py.

516  def __set__(self, instance, value, at=None, label='assignment'):
517  """Set an attribute on the config instance.
518 
519  Parameters
520  ----------
521  instance : `lsst.pex.config.Config`
522  The config instance that contains this field.
523  value : obj
524  Value to set on this field.
525  at : `list` of `lsst.pex.config.callStack.StackFrame`
526  The call stack (created by
527  `lsst.pex.config.callStack.getCallStack`).
528  label : `str`, optional
529  Event label for the history.
530 
531  Notes
532  -----
533  This method is invoked by the owning `lsst.pex.config.Config` object
534  and should not be called directly.
535 
536  Derived `~lsst.pex.config.Field` classes may need to override the
537  behavior. When overriding ``__set__``, `~lsst.pex.config.Field` authors
538  should follow the following rules:
539 
540  - Do not allow modification of frozen configs.
541  - Validate the new value **before** modifying the field. Except if the
542  new value is `None`. `None` is special and no attempt should be made
543  to validate it until `lsst.pex.config.Config.validate` is called.
544  - Do not modify the `~lsst.pex.config.Config` instance to contain
545  invalid values.
546  - If the field is modified, update the history of the
547  `lsst.pex.config.field.Field` to reflect the changes.
548 
549  In order to decrease the need to implement this method in derived
550  `~lsst.pex.config.Field` types, value validation is performed in the
551  `lsst.pex.config.Field._validateValue`. If only the validation step
552  differs in the derived `~lsst.pex.config.Field`, it is simpler to
553  implement `lsst.pex.config.Field._validateValue` than to reimplement
554  ``__set__``. More complicated behavior, however, may require
555  reimplementation.
556  """
557  if instance._frozen:
558  raise FieldValidationError(self, instance, "Cannot modify a frozen Config")
559 
560  history = instance._history.setdefault(self.name, [])
561  if value is not None:
562  value = _autocast(value, self.dtype)
563  try:
564  self._validateValue(value)
565  except BaseException as e:
566  raise FieldValidationError(self, instance, str(e))
567 
568  instance._storage[self.name] = value
569  if at is None:
570  at = getCallStack()
571  history.append((value, at, label))
572 

◆ freeze()

def pex.config.config.Field.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 in pex.config.configChoiceField.ConfigChoiceField, pex.config.configurableField.ConfigurableField, pex.config.configDictField.ConfigDictField, and pex.config.configField.ConfigField.

Definition at line 377 of file config.py.

377  def freeze(self, instance):
378  """Make this field read-only (for internal use only).
379 
380  Parameters
381  ----------
382  instance : `lsst.pex.config.Config`
383  The config instance that contains this field.
384 
385  Notes
386  -----
387  Freezing is only relevant for fields that hold subconfigs. Fields which
388  hold subconfigs should freeze each subconfig.
389 
390  **Subclasses should implement this method.**
391  """
392  pass
393 

◆ rename()

def pex.config.config.Field.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 in pex.config.configChoiceField.ConfigChoiceField, pex.config.configurableField.ConfigurableField, pex.config.configDictField.ConfigDictField, and pex.config.configField.ConfigField.

Definition at line 327 of file config.py.

327  def rename(self, instance):
328  """Rename the field in a `~lsst.pex.config.Config` (for internal use
329  only).
330 
331  Parameters
332  ----------
333  instance : `lsst.pex.config.Config`
334  The config instance that contains this field.
335 
336  Notes
337  -----
338  This method is invoked by the `lsst.pex.config.Config` object that
339  contains this field and should not be called directly.
340 
341  Renaming is only relevant for `~lsst.pex.config.Field` instances that
342  hold subconfigs. `~lsst.pex.config.Fields` that hold subconfigs should
343  rename each subconfig with the full field name as generated by
344  `lsst.pex.config.config._joinNamePath`.
345  """
346  pass
347 

◆ save()

def pex.config.config.Field.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 in pex.config.configChoiceField.ConfigChoiceField, pex.config.configurableField.ConfigurableField, pex.config.configDictField.ConfigDictField, and pex.config.configField.ConfigField.

Definition at line 435 of file config.py.

435  def save(self, outfile, instance):
436  """Save this field to a file (for internal use only).
437 
438  Parameters
439  ----------
440  outfile : file-like object
441  A writeable field handle.
442  instance : `Config`
443  The `Config` instance that contains this field.
444 
445  Notes
446  -----
447  This method is invoked by the `~lsst.pex.config.Config` object that
448  contains this field and should not be called directly.
449 
450  The output consists of the documentation string
451  (`lsst.pex.config.Field.doc`) formatted as a Python comment. The second
452  line is formatted as an assignment: ``{fullname}={value}``.
453 
454  This output can be executed with Python.
455  """
456  value = self.__get__(instance)
457  fullname = _joinNamePath(instance._name, self.name)
458 
459  if self.deprecated and value == self.default:
460  return
461 
462  # write full documentation string as comment lines
463  # (i.e. first character is #)
464  doc = "# " + str(self.doc).replace("\n", "\n# ")
465  if isinstance(value, float) and (math.isinf(value) or math.isnan(value)):
466  # non-finite numbers need special care
467  outfile.write(u"{}\n{}=float('{!r}')\n\n".format(doc, fullname, value))
468  else:
469  outfile.write(u"{}\n{}={!r}\n\n".format(doc, fullname, value))
470 

◆ toDict()

def pex.config.config.Field.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 in pex.config.configChoiceField.ConfigChoiceField, pex.config.listField.ListField, pex.config.configurableField.ConfigurableField, pex.config.dictField.DictField, pex.config.configField.ConfigField, and pex.config.configDictField.ConfigDictField.

Definition at line 471 of file config.py.

471  def toDict(self, instance):
472  """Convert the field value so that it can be set as the value of an
473  item in a `dict` (for internal use only).
474 
475  Parameters
476  ----------
477  instance : `Config`
478  The `Config` that contains this field.
479 
480  Returns
481  -------
482  value : object
483  The field's value. See *Notes*.
484 
485  Notes
486  -----
487  This method invoked by the owning `~lsst.pex.config.Config` object and
488  should not be called directly.
489 
490  Simple values are passed through. Complex data structures must be
491  manipulated. For example, a `~lsst.pex.config.Field` holding a
492  subconfig should, instead of the subconfig object, return a `dict`
493  where the keys are the field names in the subconfig, and the values are
494  the field values in the subconfig.
495  """
496  return self.__get__(instance)
497 

◆ validate()

def pex.config.config.Field.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 in pex.config.configChoiceField.ConfigChoiceField, pex.config.configurableField.ConfigurableField, pex.config.listField.ListField, pex.config.configField.ConfigField, pex.config.dictField.DictField, and pex.config.configDictField.ConfigDictField.

Definition at line 348 of file config.py.

348  def validate(self, instance):
349  """Validate the field (for internal use only).
350 
351  Parameters
352  ----------
353  instance : `lsst.pex.config.Config`
354  The config instance that contains this field.
355 
356  Raises
357  ------
358  lsst.pex.config.FieldValidationError
359  Raised if verification fails.
360 
361  Notes
362  -----
363  This method provides basic validation:
364 
365  - Ensures that the value is not `None` if the field is not optional.
366  - Ensures type correctness.
367  - Ensures that the user-provided ``check`` function is valid.
368 
369  Most `~lsst.pex.config.Field` subclasses should call
370  `lsst.pex.config.field.Field.validate` if they re-implement
371  `~lsst.pex.config.field.Field.validate`.
372  """
373  value = self.__get__(instance)
374  if not self.optional and value is None:
375  raise FieldValidationError(self, instance, "Required value cannot be None")
376 

Member Data Documentation

◆ check

pex.config.config.Field.check

Definition at line 311 of file config.py.

◆ default

pex.config.config.Field.default

Definition at line 307 of file config.py.

◆ deprecated

pex.config.config.Field.deprecated

Definition at line 298 of file config.py.

◆ doc

pex.config.config.Field.doc

Definition at line 294 of file config.py.

◆ dtype

pex.config.config.Field.dtype

Definition at line 287 of file config.py.

◆ optional

pex.config.config.Field.optional

Definition at line 315 of file config.py.

◆ source

pex.config.config.Field.source

Definition at line 322 of file config.py.

◆ supportedTypes

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

Definition at line 272 of file config.py.


The documentation for this class was generated from the following file:
pex.config.callStack.getStackFrame
def getStackFrame(relative=0)
Definition: callStack.py:58
pex.config.history.format
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174
pex.config.callStack.getCallStack
def getCallStack(skip=0)
Definition: callStack.py:175
pex.config.wrap.validate
validate
Definition: wrap.py:295