| 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 wrapper(*args, **kwargs): | t | def wrapped(*args, **kwargs): | 
            |  | rounded_args = tuple((round(arg, self.n) if isinstance(arg, |  | args = tuple((round(a, self.n) if isinstance(a, float) else | 
            |  | float) else arg for arg in args)) |  | a for a in args)) | 
            |  | rounded_kwargs = {k: round(v, self.n) if isinstance(v, float |  | kwargs = {k: round(v, self.n) if isinstance(v, float) else v | 
            |  | ) else v for k, v in kwargs.items()} |  | for k, v in kwargs.items()} | 
            |  | result = func(*rounded_args, **rounded_kwargs) |  | res = func(*args, **kwargs) | 
            |  | return round(result, self.n) if isinstance(result, float) el |  | return round(res, self.n) if isinstance(res, float) else res | 
            |  | se result |  |  | 
            |  | return wrapper |  | return wrapped | 
            |  | '\n\n@Fix(4)\ndef aver(*args, sign=1):\n    return sum(args) * sign\n\n\ |  | '\n@Fix(4)\ndef aver(*args, sign=1):\n    return sum(args) * sign\n\npri | 
            |  | n# Тест\nprint(aver(2.45675901, 3.22656321, 3.432654345, 4.075463224, si |  | nt(aver(2.45675901, 3.22656321, 3.432654345, 4.075463224, sign=-1))\n' | 
            |  | gn=-1))  # -13.191\n' |  |  |