コード例 #1
0
def positive_real(number):
    """Ensure that a value is positive."""
    try:
        float_number = float(number)
    except Exception as err:
        raise TypeConversionError(
            f"{number} not convertible to float.") from err
    if float_number <= 0:
        raise TypeConversionError("Expected a number greater than zero.")
    return float_number
コード例 #2
0
def nonnegative_real(number):
    """Ensure that a value is not negative."""
    try:
        float_number = float(number)
    except Exception as err:
        raise TypeConversionError(
            f"{number} not convertible to float.") from err
    if float_number < 0:
        raise TypeConversionError("Expected a nonnegative real number.")
    return float_number
コード例 #3
0
 def __call__(self, value):
     """Called when the value is set."""
     try:
         return self.converter(value)
     except (TypeError, ValueError, TypeConversionError) as err:
         if value is RequiredArg:
             raise TypeConversionError("Value is a required argument")
         raise TypeConversionError(
             "Value {} of type {} cannot be converted using {}. Raised "
             "error: {}".format(value, type(value), str(self.converter),
                                str(err)))
コード例 #4
0
 def __call__(self, sequence):
     """Called when the value is set."""
     if not _is_iterable(sequence):
         raise TypeConversionError(
             "Expected a sequence like instance. Received {} of type {}."
             "".format(sequence, type(sequence)))
     else:
         new_sequence = []
         try:
             for i, (v, c) in enumerate(zip(sequence, self)):
                 new_sequence.append(c(v))
         except (TypeConversionError) as err:
             raise TypeConversionError("In list item number {}: {}"
                                       "".format(i, str(err)))
         return new_sequence
コード例 #5
0
 def _validate(self, sequence):
     """Called when the value is set."""
     if not _is_iterable(sequence):
         raise TypeConversionError(
             f"Expected a sequence like instance. Received {sequence} of "
             f"type {type(sequence)}.")
     else:
         new_sequence = []
         try:
             for i, v in enumerate(sequence):
                 new_sequence.append(self.converter(v))
         except (ValueError, TypeError) as err:
             raise TypeConversionError(
                 f"In list item number {i}: {str(err)}") from err
         return new_sequence
コード例 #6
0
    def __call__(self, mapping):
        """Called when the value is set."""
        if not isinstance(mapping, Mapping):
            raise TypeConversionError(
                "Expected a dict like value. Recieved {} of type {}."
                "".format(mapping, type(mapping)))

        new_mapping = dict()
        try:
            for key, value in mapping.items():
                if key in self:
                    new_mapping[key] = self.converter[key](value)
                else:
                    new_mapping[key] = value
        except (TypeConversionError) as err:
            raise TypeConversionError("In key {}: {}"
                                      "".format(str(key), str(err)))
        return new_mapping
コード例 #7
0
    def _validate(self, mapping):
        """Called when the value is set."""
        if not isinstance(mapping, Mapping):
            raise TypeConversionError(
                f"Expected a dict like value. Recieved {mapping} of type "
                f"{type(mapping)}.")

        new_mapping = {}
        for key, value in mapping.items():
            if key in self:
                try:
                    new_mapping[key] = self.converter[key](value)
                except (ValueError, TypeError) as err:
                    raise TypeConversionError(
                        f"In key {key}: {str(err)}") from err
            else:
                new_mapping[key] = value
        return new_mapping
コード例 #8
0
 def __call__(self, sequence):
     """Called when the value is set."""
     if not _is_iterable(sequence):
         raise TypeConversionError(
             "Expected a tuple like object. Received {} of type {}."
             "".format(sequence, type(sequence)))
     elif len(sequence) != len(self.converter):
         raise TypeConversionError(
             "Expected exactly {} items. Received {}.".format(
                 len(self.converter), len(sequence)))
     else:
         new_sequence = []
         try:
             for i, (v, c) in enumerate(zip(sequence, self)):
                 new_sequence.append(c(v))
         except (TypeConversionError) as err:
             raise TypeConversionError("In tuple item number {}: {}"
                                       "".format(i, str(err)))
         return tuple(new_sequence)
コード例 #9
0
 def __setitem__(self, key, val):
     """Set parameter by key."""
     keys = self._yield_keys(key)
     try:
         val = self._validate_values(val)
     except TypeConversionError as err:
         raise TypeConversionError("For types {}, error {}.".format(
             list(keys), str(err)))
     for key in keys:
         self._dict[key] = val
コード例 #10
0
 def __setitem__(self, keys, item):
     """Set parameter by key."""
     keys = self._indexer(keys)
     try:
         validated_value = self._validate_values(item)
     except ValueError as err:
         raise TypeConversionError(
             f"For types {list(keys)}: {str(err)}.") from err
     for key in keys:
         self._single_setitem(key, validated_value)
コード例 #11
0
 def _validate(self, sequence):
     """Called when the value is set."""
     if not _is_iterable(sequence):
         raise TypeConversionError(
             f"Expected a tuple like object. Received {sequence} of type "
             f"{type(sequence)}.")
     elif len(sequence) != len(self.converter):
         raise TypeConversionError(
             f"Expected exactly {len(self.converter)} items. Received "
             f"{len(sequence)}.")
     else:
         new_sequence = []
         try:
             for i, (v, c) in enumerate(zip(sequence, self)):
                 new_sequence.append(c(v))
         except (ValueError, TypeError) as err:
             raise TypeConversionError(
                 f"In tuple item number {i}: {str(err)}") from err
         return tuple(new_sequence)
コード例 #12
0
 def __call__(self, value):
     if value is RequiredArg:
         return value
     if value is None:
         if not self._allow_none:
             raise ValueError("None is not allowed.")
         else:
             return None
     try:
         return self._postprocess(self._validate(self._preprocess(value)))
     except Exception as err:
         if isinstance(err, TypeConversionError):
             raise err
         raise TypeConversionError(
             f"Error raised in conversion: {str(err)}") from err
コード例 #13
0
 def _validate(self, value):
     if isinstance(value, self.disallow_types):
         raise TypeConversionError(
             f"Value {value} cannot be of type {type(value)}")
     if isinstance(value, self.types):
         return value
     elif self.strict:
         raise ValueError(
             f"Value {value} is not an instance of any of {self.types}.")
     else:
         for type_ in self.types:
             try:
                 return type_(value)
             except Exception:
                 pass
         raise ValueError(
             f"Value {value} is not convertable into any of these types "
             f"{self.types}")