n | """ | n | |
| Написать класс-параметрический декоратор Fix(n), с помощью которого все | | |
| вещественные (как позиционные, так и именные) параметры произвольной дек | | |
| орируемой функции, а также её возвращаемое значение, округляются до n-го | | |
| знака после запятой (1 ⩽ n ⩽ 16). Если какие-то параметры функции оказа | | |
| лись не вещественными, или не вещественно возвращаемое значение, эти объ | | |
| екты не меняются. | | |
| """ | | |
| from functools import wraps | | from functools import wraps |
| | | |
| class Fix: | | class Fix: |
| | | |
| def __init__(self, n): | | def __init__(self, n): |
| self.n = n | | self.n = n |
| | | |
n | def __call__(self, fun): | n | def __call__(self, func): |
| | | |
n | @wraps(fun) | n | @wraps(func) |
| def wrapper(*args, **kwargs): | | def wrapper(*args, **kwargs): |
| new_args = tuple((round(arg, self.n) if isinstance(arg, floa | | new_args = tuple((round(arg, self.n) if isinstance(arg, floa |
| t) else arg for arg in args)) | | t) else arg for arg in args)) |
t | new_kwargs = {k: round(v, self.n) if isinstance(v, float) el | t | new_kwargs = {key: round(value, self.n) if isinstance(value, |
| se v for k, v in kwargs.items()} | | float) else value for key, value in kwargs.items()} |
| result = fun(*new_args, **new_kwargs) | | result = func(*new_args, **new_kwargs) |
| if isinstance(result, float): | | if isinstance(result, float): |
| result = round(result, self.n) | | result = round(result, self.n) |
| return result | | return result |
| return wrapper | | return wrapper |