28 __all__ = [
"RangeField"]
30 from .config
import Field, _typeStr
31 from .callStack
import getStackFrame
35 """A configuration field (`lsst.pex.config.Field` subclass) that requires
36 the value to be in a specific numeric range.
41 A description of the field.
42 dtype : {`int`-type, `float`-type}
43 The field's data type: either the `int` or `float` type.
44 default : `int` or `float`, optional
45 Default value for the field.
46 optional : `bool`, optional
47 When `False`, `lsst.pex.config.Config.validate` will fail if the
48 field's value is `None`.
49 min : int, float, or `None`, optional
50 Minimum value accepted in the range. If `None`, the range has no
51 lower bound (equivalent to negative infinity).
52 max : `int`, `float`, or None, optional
53 Maximum value accepted in the range. If `None`, the range has no
54 upper bound (equivalent to positive infinity).
55 inclusiveMin : `bool`, optional
56 If `True` (default), the ``min`` value is included in the allowed
58 inclusiveMax : `bool`, optional
59 If `True` (default), the ``max`` value is included in the allowed
61 deprecated : None or `str`, optional
62 A description of why this Field is deprecated, including removal date.
63 If not None, the string is appended to the docstring for this Field.
78 supportedTypes =
set((int, float))
79 """The set of data types allowed by `RangeField` instances (`set`
80 containing `int` and `float` types).
83 def __init__(self, doc, dtype, default=None, optional=False,
84 min=None, max=None, inclusiveMin=True, inclusiveMax=False,
87 raise ValueError(
"Unsupported RangeField dtype %s" % (_typeStr(dtype)))
89 if min
is None and max
is None:
90 raise ValueError(
"min and max cannot both be None")
92 if min
is not None and max
is not None:
94 raise ValueError(
"min = %s > %s = max" % (min, max))
95 elif min == max
and not (inclusiveMin
and inclusiveMax):
96 raise ValueError(
"min = max = %s and min and max not both inclusive" % (min,))
99 """Minimum value accepted in the range. If `None`, the range has no
100 lower bound (equivalent to negative infinity).
104 """Maximum value accepted in the range. If `None`, the range has no
105 upper bound (equivalent to positive infinity).
109 self.
maxCheck =
lambda x, y:
True if y
is None else x <= y
111 self.
maxCheck =
lambda x, y:
True if y
is None else x < y
113 self.
minCheck =
lambda x, y:
True if y
is None else x >= y
115 self.
minCheck =
lambda x, y:
True if y
is None else x > y
116 self.
_setup(doc, dtype=dtype, default=default, check=
None, optional=optional, source=source,
117 deprecated=deprecated)
119 ((
"[" if inclusiveMin
else "("),
120 (
"-inf" if self.
min is None else self.
min),
121 (
"inf" if self.
max is None else self.
max),
122 (
"]" if inclusiveMax
else ")"))
123 """String representation of the field's allowed range (`str`).
128 def _validateValue(self, value):
129 Field._validateValue(self, value)
132 msg =
"%s is outside of valid range %s" % (value, self.
rangeString)
133 raise ValueError(msg)