| 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 |