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.configurableField.ConfigurableField Class Reference
Inheritance diagram for pex.config.configurableField.ConfigurableField:
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 pex.config.configurableField.ConfigurableField.__init__ (   self,
  doc,
  target,
  ConfigClass = None,
  default = None,
  check = None,
  deprecated = None 
)

Reimplemented from 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 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 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 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.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 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 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 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 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 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 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 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 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 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 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 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 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 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 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

pex.config.config.Field.check
inherited

Definition at line 311 of file config.py.

◆ ConfigClass

pex.config.configurableField.ConfigurableField.ConfigClass

Definition at line 274 of file configurableField.py.

◆ default

pex.config.config.Field.default
inherited

Definition at line 307 of file config.py.

◆ deprecated

pex.config.config.Field.deprecated
inherited

Definition at line 298 of file config.py.

◆ doc

pex.config.config.Field.doc
inherited

Definition at line 294 of file config.py.

◆ dtype

pex.config.config.Field.dtype
inherited

Definition at line 287 of file config.py.

◆ optional

pex.config.config.Field.optional
inherited

Definition at line 315 of file config.py.

◆ source

pex.config.config.Field.source
inherited

Definition at line 322 of file config.py.

◆ supportedTypes

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

Definition at line 272 of file config.py.

◆ target

pex.config.configurableField.ConfigurableField.target

Definition at line 273 of file configurableField.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
type
table::Key< int > type
Definition: Detector.cc:163
pex.config.wrap.validate
validate
Definition: wrap.py:295