LSSTApplications  19.0.0-14-gb0260a2+72efe9b372,20.0.0+7927753e06,20.0.0+8829bf0056,20.0.0+995114c5d2,20.0.0+b6f4b2abd1,20.0.0+bddc4f4cbe,20.0.0-1-g253301a+8829bf0056,20.0.0-1-g2b7511a+0d71a2d77f,20.0.0-1-g5b95a8c+7461dd0434,20.0.0-12-g321c96ea+23efe4bbff,20.0.0-16-gfab17e72e+fdf35455f6,20.0.0-2-g0070d88+ba3ffc8f0b,20.0.0-2-g4dae9ad+ee58a624b3,20.0.0-2-g61b8584+5d3db074ba,20.0.0-2-gb780d76+d529cf1a41,20.0.0-2-ged6426c+226a441f5f,20.0.0-2-gf072044+8829bf0056,20.0.0-2-gf1f7952+ee58a624b3,20.0.0-20-geae50cf+e37fec0aee,20.0.0-25-g3dcad98+544a109665,20.0.0-25-g5eafb0f+ee58a624b3,20.0.0-27-g64178ef+f1f297b00a,20.0.0-3-g4cc78c6+e0676b0dc8,20.0.0-3-g8f21e14+4fd2c12c9a,20.0.0-3-gbd60e8c+187b78b4b8,20.0.0-3-gbecbe05+48431fa087,20.0.0-38-ge4adf513+a12e1f8e37,20.0.0-4-g97dc21a+544a109665,20.0.0-4-gb4befbc+087873070b,20.0.0-4-gf910f65+5d3db074ba,20.0.0-5-gdfe0fee+199202a608,20.0.0-5-gfbfe500+d529cf1a41,20.0.0-6-g64f541c+d529cf1a41,20.0.0-6-g9a5b7a1+a1cd37312e,20.0.0-68-ga3f3dda+5fca18c6a4,20.0.0-9-g4aef684+e18322736b,w.2020.45
LSSTDataManagementBasePackage
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
lsst.pex.config.configurableField.ConfigurableField Class Reference
Inheritance diagram for lsst.pex.config.configurableField.ConfigurableField:
lsst.pex.config.config.Field

Public Member Functions

def validateTarget (self, target, ConfigClass)
 
def __init__ (self, doc, target, ConfigClass=None, default=None, check=None, deprecated=None)
 
def __get__ (self, instance, owner=None, at=None, label="default")
 
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 __deepcopy__ (self, memo)
 
def __delete__ (self, instance, at=None, label='deletion')
 

Public Attributes

 target
 
 ConfigClass
 
 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 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 170 of file configurableField.py.

Constructor & Destructor Documentation

◆ __init__()

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

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

Definition at line 261 of file configurableField.py.

261  def __init__(self, doc, target, ConfigClass=None, default=None, check=None, deprecated=None):
262  ConfigClass = self.validateTarget(target, ConfigClass)
263 
264  if default is None:
265  default = ConfigClass
266  if default != ConfigClass and type(default) != ConfigClass:
267  raise TypeError("'default' is of incorrect type %s. Expected %s" %
268  (_typeStr(default), _typeStr(ConfigClass)))
269 
270  source = getStackFrame()
271  self._setup(doc=doc, dtype=ConfigurableInstance, default=default,
272  check=check, optional=False, source=source, deprecated=deprecated)
273  self.target = target
274  self.ConfigClass = ConfigClass
275 

Member Function Documentation

◆ __deepcopy__()

def 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 354 of file configurableField.py.

354  def __deepcopy__(self, memo):
355  """Customize deep-copying, because we always want a reference to the
356  original typemap.
357 
358  WARNING: this must be overridden by subclasses if they change the
359  constructor signature!
360  """
361  return type(self)(doc=self.doc, target=self.target, ConfigClass=self.ConfigClass,
362  default=copy.deepcopy(self.default))
363 

◆ __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 625 of file config.py.

625  def __delete__(self, instance, at=None, label='deletion'):
626  """Delete an attribute from a `lsst.pex.config.Config` instance.
627 
628  Parameters
629  ----------
630  instance : `lsst.pex.config.Config`
631  The config instance that contains this field.
632  at : `list` of `lsst.pex.config.callStack.StackFrame`
633  The call stack (created by
634  `lsst.pex.config.callStack.getCallStack`).
635  label : `str`, optional
636  Event label for the history.
637 
638  Notes
639  -----
640  This is invoked by the owning `~lsst.pex.config.Config` object and
641  should not be called directly.
642  """
643  if at is None:
644  at = getCallStack()
645  self.__set__(instance, None, at=at, label=label)
646 

◆ __get__()

def lsst.pex.config.configurableField.ConfigurableField.__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 from lsst.pex.config.config.Field.

Definition at line 285 of file configurableField.py.

285  def __get__(self, instance, owner=None, at=None, label="default"):
286  if instance is None or not isinstance(instance, Config):
287  return self
288  else:
289  return self.__getOrMake(instance, at=at, label=label)
290 

◆ __set__()

def lsst.pex.config.configurableField.ConfigurableField.__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 291 of file configurableField.py.

291  def __set__(self, instance, value, at=None, label="assignment"):
292  if instance._frozen:
293  raise FieldValidationError(self, instance, "Cannot modify a frozen Config")
294  if at is None:
295  at = getCallStack()
296  oldValue = self.__getOrMake(instance, at=at)
297 
298  if isinstance(value, ConfigurableInstance):
299  oldValue.retarget(value.target, value.ConfigClass, at, label)
300  oldValue.update(__at=at, __label=label, **value._storage)
301  elif type(value) == oldValue._ConfigClass:
302  oldValue.update(__at=at, __label=label, **value._storage)
303  elif value == oldValue.ConfigClass:
304  value = oldValue.ConfigClass()
305  oldValue.update(__at=at, __label=label, **value._storage)
306  else:
307  msg = "Value %s is of incorrect type %s. Expected %s" % \
308  (value, _typeStr(value), _typeStr(oldValue.ConfigClass))
309  raise FieldValidationError(self, instance, msg)
310 

◆ freeze()

def 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 338 of file configurableField.py.

338  def freeze(self, instance):
339  value = self.__getOrMake(instance)
340  value.freeze()
341 

◆ rename()

def 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.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 311 of file configurableField.py.

311  def rename(self, instance):
312  fullname = _joinNamePath(instance._name, self.name)
313  value = self.__getOrMake(instance)
314  value._rename(fullname)
315 

◆ save()

def 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 : `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 323 of file configurableField.py.

323  def save(self, outfile, instance):
324  fullname = _joinNamePath(instance._name, self.name)
325  value = self.__getOrMake(instance)
326  target = value.target
327 
328  if target != self.target:
329  # not targeting the field-default target.
330  # save target information
331  ConfigClass = value.ConfigClass
332  outfile.write(u"{}.retarget(target={}, ConfigClass={})\n\n".format(fullname,
333  _typeStr(target),
334  _typeStr(ConfigClass)))
335  # save field values
336  value._save(outfile)
337 

◆ toDict()

def 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 : `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 342 of file configurableField.py.

342  def toDict(self, instance):
343  value = self.__get__(instance)
344  return value.toDict()
345 

◆ validate()

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

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

Definition at line 346 of file configurableField.py.

346  def validate(self, instance):
347  value = self.__get__(instance)
348  value.validate()
349 
350  if self.check is not None and not self.check(value):
351  msg = "%s is not a valid value" % str(value)
352  raise FieldValidationError(self, instance, msg)
353 

◆ validateTarget()

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

Parameters
----------
target
    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 219 of file configurableField.py.

219  def validateTarget(self, target, ConfigClass):
220  """Validate the target and configuration class.
221 
222  Parameters
223  ----------
224  target
225  The configurable being verified.
226  ConfigClass : `lsst.pex.config.Config`-type or `None`
227  The configuration class associated with the ``target``. This can
228  be `None` if ``target`` has a ``ConfigClass`` attribute.
229 
230  Raises
231  ------
232  AttributeError
233  Raised if ``ConfigClass`` is `None` and ``target`` does not have a
234  ``ConfigClass`` attribute.
235  TypeError
236  Raised if ``ConfigClass`` is not a `~lsst.pex.config.Config`
237  subclass.
238  ValueError
239  Raised if:
240 
241  - ``target`` is not callable (callables have a ``__call__``
242  method).
243  - ``target`` is not startically defined (does not have
244  ``__module__`` or ``__name__`` attributes).
245  """
246  if ConfigClass is None:
247  try:
248  ConfigClass = target.ConfigClass
249  except Exception:
250  raise AttributeError("'target' must define attribute 'ConfigClass'")
251  if not issubclass(ConfigClass, Config):
252  raise TypeError("'ConfigClass' is of incorrect type %s."
253  "'ConfigClass' must be a subclass of Config" % _typeStr(ConfigClass))
254  if not hasattr(target, '__call__'):
255  raise ValueError("'target' must be callable")
256  if not hasattr(target, '__module__') or not hasattr(target, '__name__'):
257  raise ValueError("'target' must be statically defined"
258  "(must have '__module__' and '__name__' attributes)")
259  return ConfigClass
260 

Member Data Documentation

◆ check

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

Definition at line 363 of file config.py.

◆ ConfigClass

lsst.pex.config.configurableField.ConfigurableField.ConfigClass

Definition at line 274 of file configurableField.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.

◆ target

lsst.pex.config.configurableField.ConfigurableField.target

Definition at line 273 of file configurableField.py.


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