48 lines
1.0 KiB
Markdown
48 lines
1.0 KiB
Markdown
# Exercise 7.1 - Solution
|
|
|
|
```python
|
|
# validate.py
|
|
...
|
|
|
|
from inspect import signature
|
|
|
|
def validated(func):
|
|
sig = signature(func)
|
|
|
|
# Gather the function annotations
|
|
annotations = dict(func.__annotations__)
|
|
|
|
# Get the return annotation (if any)
|
|
retcheck = annotations.pop('return', None)
|
|
|
|
def wrapper(*args, **kwargs):
|
|
bound = sig.bind(*args, **kwargs)
|
|
errors = []
|
|
|
|
# Enforce argument checks
|
|
for name, validator in annotations.items():
|
|
try:
|
|
validator.check(bound.arguments[name])
|
|
except Exception as e:
|
|
errors.append(f' {name}: {e}')
|
|
|
|
if errors:
|
|
raise TypeError('Bad Arguments\n' + '\n'.join(errors))
|
|
|
|
result = func(*args, **kwargs)
|
|
|
|
# Enforce return check (if any)
|
|
if retcheck:
|
|
try:
|
|
retcheck.check(result)
|
|
except Exception as e:
|
|
raise TypeError(f'Bad return: {e}') from None
|
|
return result
|
|
|
|
return wrapper
|
|
```
|
|
|
|
|
|
|
|
[Back](ex7_1.md)
|