typing_validation.validation_failure
Validation failure tracking functionality.
Acc
- Acc = ~Acc
Type variable for the accumulator in
ValidationFailure.visit
.
FailureTreeVisitor
- class FailureTreeVisitor(*args, **kwargs)[source]
-
Structural type for visitor functions that can be passed to
ValidationFailure.visit
.
InvalidNumpyDTypeValidationFailure
- class InvalidNumpyDTypeValidationFailure(val, t, *, type_aliases=None)[source]
Bases:
ValidationFailure
Validation failures arising because of invalid NumPy dtype.
MissingKeysValidationFailure
- class MissingKeysValidationFailure(val, t, missing_keys, *, type_aliases=None)[source]
Bases:
ValidationFailure
Validation failures arising because of missing required keys in a mapping.
SubtypeValidationFailure
- class SubtypeValidationFailure(s, t, *, type_aliases=None)[source]
Bases:
ValidationFailure
Validation failures arising from
validate(s, Type[t])
whens
is not a subtype oft
.
TypeVarBoundValidationFailure
- class TypeVarBoundValidationFailure(val, t, bound_cause, *, type_aliases=None)[source]
Bases:
ValidationFailure
Validation failures arising from the bound of a type variable.
UnionValidationFailure
- class UnionValidationFailure(val, t, *causes, type_aliases=None)[source]
Bases:
ValidationFailure
Validation failures arising from union types.
ValidationFailure
- class ValidationFailure(val, t, *causes, type_aliases=None)[source]
Bases:
object
Generic validation failures.
- property causes
Validation failure that in turn caused this failure (if any).
- Return type:
- rich_print()[source]
Pretty-prints the validation failure tree using rich:
>>> from typing import Union, Collection >>> from typing_validation import validate, latest_validation_failure >>> validate([[0, 1, 2], {"hi": 0}], list[Union[Collection[int], dict[str, str]]]) TypeError: ... >>> latest_validation_failure().rich_print() Failure tree └── (list[typing.Union[typing.Collection[int], dict[str, str]]], [[0, 1, 2], {'hi': 0}]) └── (typing.Union[typing.Collection[int], dict[str, str]], {'hi': 0}) ├── (typing.Collection[int], {'hi': 0}) │ └── (<class 'int'>, 'hi') └── (dict[str, str], {'hi': 0}) └── (<class 'str'>, 0)
Raises
ModuleNotFoundError
if rich is not installed.- Return type:
- property t
The type involved in the validation failure.
- Return type:
Any
- property type_aliases
The type aliases that were set at the time of validation.
- property val
The value involved in the validation failure.
- Return type:
Any
- visit(fun, acc)[source]
Performs a pre-order visit of the validation failure tree:
applies
fun(self.val, self.t, acc)
to the failure,saves the return value as
new_acc
recurses on all causes using
new_acc
.
For example, this can be used to implement pretty-prenting of validation failures (see
ValidationFailure.rich_print
):>>> import rich >>> from rich.tree import Tree >>> from rich.text import Text >>> from typing import Any, Collection, Union >>> from typing_validation import validate, latest_validation_failure >>> validate([[0, 1, 2], {"hi": 0}], list[Union[Collection[int], dict[str, str]]]) TypeError: ... >>> failure_tree = Tree("Failure tree") >>> def tree_builder(val: Any, t: Any, tree_tip: Tree) -> Tree: ... label = Text(f"({repr(t)}, {repr(val)})") ... tree_tip.add(label) # see https://rich.readthedocs.io/en/latest/tree.html ... return tree_tip ... >>> latest_validation_failure().visit(tree_builder, failure_tree) >>> rich.print(failure_tree) Failure tree └── (list[typing.Union[typing.Collection[int], dict[str, str]]], [[0, 1, 2], {'hi': 0}]) └── (typing.Union[typing.Collection[int], dict[str, str]], {'hi': 0}) ├── (typing.Collection[int], {'hi': 0}) │ └── (<class 'int'>, 'hi') └── (dict[str, str], {'hi': 0}) └── (<class 'str'>, 0)
ValidationFailureAtIdx
- class ValidationFailureAtIdx(val, t, idx_cause, idx, *, ordered=True, type_aliases=None)[source]
Bases:
ValidationFailure
Validation failures arising at a given index of a sequence.
ValidationFailureAtKey
- class ValidationFailureAtKey(val, t, key_cause, key, *, type_aliases=None)[source]
Bases:
ValidationFailure
Validation failures arising at a given key of a mapping.
- property key
The key of the outer sequence at which this failure arose.
- Return type:
Any
get_validation_failure
- get_validation_failure(err)[source]
Programmatic access to the validation failure tree for the latest validation call.
>>> from typing_validation import validate, get_validation_failure >>> try: ... validate([[0, 1], [1, 2], [2, "hi"]], list[list[int]]) ... except TypeError as err: ... validation_failure = get_validation_failure(err) ... >>> validation_failure ValidationFailure([[0, 1], [1, 2], [2, 'hi']], list[list[int]], ValidationFailure([2, 'hi'], list[int], ValidationFailure('hi', <class 'int'>)))
Raises
TypeError
if the given errorerr
is aTypeError
. RaisesValueError
if no validation failure data is available (whenerr
is not a validation error raised by this library).- Return type:
latest_validation_failure
- latest_validation_failure()[source]
Programmatic access to the validation failure tree for the latest validation call. Uses
sys.last_value
, so it must be called immediately after the error occurred.>>> from typing_validation import validate, latest_validation_failure >>> validate([[0, 1], [1, 2], [2, "hi"]], list[list[int]]) TypeError: ... >>> latest_validation_failure() ValidationFailure([[0, 1], [1, 2], [2, 'hi']], list[list[int]], ValidationFailure([2, 'hi'], list[int], ValidationFailure('hi', <class 'int'>)))
This validation failure information is also set by
is_valid
in case of failed validation, even though no error is raised.- Return type: