1
- """
2
- Utils.py
3
- --------
4
- """
1
+ """Utils."""
5
2
# -*- coding: utf-8 -*-
6
3
7
4
# standard
11
8
12
9
13
10
class ValidationFailure (Exception ):
14
- """
15
- Exception class when validation failure occurs
16
- """
11
+ """Exception class when validation failure occurs."""
17
12
18
13
def __init__ (self , function : Callable [..., Any ], arg_dict : Dict [str , Any ]):
14
+ """Initialize Validation Failure."""
19
15
self .func = function
20
16
self .__dict__ .update (arg_dict )
21
17
22
18
def __repr__ (self ) -> str :
19
+ """Repr Validation Failure."""
23
20
return (
24
21
f"ValidationFailure(func={ self .func .__name__ } , "
25
22
+ f"args={ ({k : v for (k , v ) in self .__dict__ .items () if k != 'func' })} )"
26
23
)
27
24
28
25
def __str__ (self ) -> str :
26
+ """Str Validation Failure."""
29
27
return repr (self )
30
28
31
29
def __bool__ (self ) -> Literal [False ]:
30
+ """Bool Validation Failure."""
32
31
return False
33
32
34
33
35
34
def _func_args_as_dict (func : Callable [..., Any ], * args : Any , ** kwargs : Any ) -> Dict [str , Any ]:
36
- """
37
- Return given function's positional and key value arguments as an ordered
38
- dictionary.
39
-
40
- :param func: function to decorate
41
- :param args: positional function arguments
42
- :param kwargs: key value function arguments
43
- """
44
-
35
+ """Return function's positional and key value arguments as an ordered dictionary."""
45
36
# TODO: find more efficient way to do it
46
37
return dict (
47
38
list (zip (dict .fromkeys (chain (getfullargspec (func )[0 ], kwargs .keys ())), args ))
@@ -50,8 +41,7 @@ def _func_args_as_dict(func: Callable[..., Any], *args: Any, **kwargs: Any) -> D
50
41
51
42
52
43
def validator (func : Callable [..., Any ]) -> Callable [..., Union [Literal [True ], ValidationFailure ]]:
53
- """
54
- A decorator that makes given function validator.
44
+ """A decorator that makes given function validator.
55
45
56
46
Whenever the given function is called and returns ``False`` value
57
47
this decorator returns :class:`ValidationFailure` object.
@@ -63,14 +53,16 @@ def validator(func: Callable[..., Any]) -> Callable[..., Union[Literal[True], Va
63
53
... return not (value % 2)
64
54
65
55
>>> even(4)
66
- True
56
+ # Output: True
67
57
68
58
>>> even(5)
69
- ValidationFailure(func=even, args={'value': 5})
59
+ # Output: ValidationFailure(func=even, args={'value': 5})
60
+
61
+ Args:
62
+ `func`: function which is to be decorated.
70
63
71
- :param func: function to decorate
72
- :param args: positional function arguments
73
- :param kwargs: key value function arguments
64
+ Returns:
65
+ Wrapper function as a decorator.
74
66
"""
75
67
76
68
def wrapper (* args : Any , ** kwargs : Any ) -> Union [Literal [True ], ValidationFailure ]:
@@ -79,5 +71,15 @@ def wrapper(*args: Any, **kwargs: Any) -> Union[Literal[True], ValidationFailure
79
71
if func (* args , ** kwargs )
80
72
else ValidationFailure (func , _func_args_as_dict (func , * args , ** kwargs ))
81
73
)
74
+ # try:
75
+ # return (
76
+ # True
77
+ # if func(*args, **kwargs)
78
+ # else ValidationFailure(func, _func_args_as_dict(func, *args, **kwargs))
79
+ # )
80
+ # except (AssertionError, TypeError) as err:
81
+ # print(err)
82
+ # finally:
83
+ # return ValidationFailure(func, _func_args_as_dict(func, *args, **kwargs))
82
84
83
85
return wrapper
0 commit comments