Софья Есауленко, группа 319/2 CorrectFloat 14179
Леухин Илья Олегович, 313 (Севастополь) CorrectFloat 13498
nn1"""
2 
3Написать класс-параметрический декоратор Fix(n), 
4с помощью которого все вещественные (как позиционные, так и именные) пар
 >аметры произвольной декорируемой функции, 
5а также её возвращаемое значение, округляются до n-го знака после запято
 >й (1 ⩽ n ⩽ 16). 
6Если какие-то параметры функции оказались не вещественными, или не вещес
 >твенно возвращаемое значение, эти объекты не меняются.
7 
8Подсказка: Требуется использовать @wraps
9 
10Input (1):
11```
12@Fix(4)
13def aver(*args, sign=1):
14    return sum(args)*sign
15 
16print(aver(2.45675901, 3.22656321, 3.432654345, 4.075463224, sign=-1))
17```
18 
19В примере входные данные сначала округляются до 2.4568, 3.2266, 3.4327, 
 >4.0755, затем складываются, затем снова округляются. 
20А sign не преобразуется (хотя этого и не видно :)), потому что он не вещ
 >ественный.
21 
22Output (1):
23```
24-13.1916
25```
26 
27"""
1from functools import wraps28from functools import wraps
229
3class Fix:30class Fix:
431
5    def __init__(self, n):32    def __init__(self, n):
6        self.n = n33        self.n = n
734
8    def __call__(self, func):35    def __call__(self, func):
936
10        @wraps(func)37        @wraps(func)
t11        def wrapper(*args, **kwargs):t38        def wrapped(*args, **kwargs):
12            rounded_args = tuple((round(arg, self.n) if isinstance(arg39            args = tuple((round(a, self.n) if isinstance(a, float) else 
>float) else arg for arg in args))>a for a in args))
13            rounded_kwargs = {k: round(v, self.n) if isinstance(v, float40            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()}
14            result = func(*rounded_args, **rounded_kwargs)41            res = func(*args, **kwargs)
15            return round(result, self.n) if isinstance(result, float) el42            return round(res, self.n) if isinstance(res, float) else res
>se result 
16        return wrapper43        return wrapped
17'\n\n@Fix(4)\ndef aver(*args, sign=1):\n    return sum(args) * sign\n\n\44'\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' 
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op