| n | """ | n |  | 
            |  |  |  |  | 
            |  | Написать класс-параметрический декоратор Fix(n), |  |  | 
            |  | с помощью которого все вещественные (как позиционные, так и именные) пар |  |  | 
            |  | аметры произвольной декорируемой функции, |  |  | 
            |  | а также её возвращаемое значение, округляются до n-го знака после запято |  |  | 
            |  | й (1 ⩽ n ⩽ 16). |  |  | 
            |  | Если какие-то параметры функции оказались не вещественными, или не вещес |  |  | 
            |  | твенно возвращаемое значение, эти объекты не меняются. |  |  | 
            |  |  |  |  | 
            |  | Подсказка: Требуется использовать @wraps |  |  | 
            |  |  |  |  | 
            |  | Input (1): |  |  | 
            |  | ``` |  |  | 
            |  | @Fix(4) |  |  | 
            |  | def aver(*args, sign=1): |  |  | 
            |  | return sum(args)*sign |  |  | 
            |  |  |  |  | 
            |  | print(aver(2.45675901, 3.22656321, 3.432654345, 4.075463224, sign=-1)) |  |  | 
            |  | ``` |  |  | 
            |  |  |  |  | 
            |  | В примере входные данные сначала округляются до 2.4568, 3.2266, 3.4327, |  |  | 
            |  | 4.0755, затем складываются, затем снова округляются. |  |  | 
            |  | А sign не преобразуется (хотя этого и не видно :)), потому что он не вещ |  |  | 
            |  | ественный. |  |  | 
            |  |  |  |  | 
            |  | Output (1): |  |  | 
            |  | ``` |  |  | 
            |  | -13.1916 |  |  | 
            |  | ``` |  |  | 
            |  |  |  |  | 
            |  | """ |  |  | 
            |  | 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 | 
            |  |  |  |  | 
            |  | def __call__(self, func): |  | def __call__(self, func): | 
            |  |  |  |  | 
            |  | @wraps(func) |  | @wraps(func) | 
            | t | def wrapped(*args, **kwargs): | t | def wrapper(*args, **kwargs): | 
            |  | args = tuple((round(a, self.n) if isinstance(a, float) else |  | rounded_args = tuple((round(arg, self.n) if isinstance(arg, | 
            |  | a for a in args)) |  | float) else arg for arg in args)) | 
            |  | kwargs = {k: round(v, self.n) if isinstance(v, float) else v |  | rounded_kwargs = {k: round(v, self.n) if isinstance(v, float | 
            |  | for k, v in kwargs.items()} |  | ) else v for k, v in kwargs.items()} | 
            |  | res = func(*args, **kwargs) |  | result = func(*rounded_args, **rounded_kwargs) | 
            |  | return round(res, self.n) if isinstance(res, float) else res |  | return round(result, self.n) if isinstance(result, float) el | 
            |  |  |  | se result | 
            |  | return wrapped |  | return wrapper | 
            |  | '\n@Fix(4)\ndef aver(*args, sign=1):\n    return sum(args) * sign\n\npri |  | '\n\n@Fix(4)\ndef aver(*args, sign=1):\n    return sum(args) * sign\n\n\ | 
            |  | nt(aver(2.45675901, 3.22656321, 3.432654345, 4.075463224, sign=-1))\n' |  | n# Тест\nprint(aver(2.45675901, 3.22656321, 3.432654345, 4.075463224, si | 
            |  |  |  | gn=-1))  # -13.191\n' |