Леухин Илья Олегович, 313 (Севастополь) CorrectFloat 13498
Софья Есауленко, группа 319/2 CorrectFloat 14179
n1"""n
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"""
28from functools import wraps1from functools import wraps
292
30class Fix:3class Fix:
314
32    def __init__(self, n):5    def __init__(self, n):
33        self.n = n6        self.n = n
347
35    def __call__(self, func):8    def __call__(self, func):
369
37        @wraps(func)10        @wraps(func)
t38        def wrapped(*args, **kwargs):t11        def wrapper(*args, **kwargs):
39            args = tuple((round(a, self.n) if isinstance(a, float) else 12            rounded_args = tuple((round(arg, self.n) if isinstance(arg
>a for a in args))>float) else arg for arg in args))
40            kwargs = {k: round(v, self.n) if isinstance(v, float) else v13            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()}
41            res = func(*args, **kwargs)14            result = func(*rounded_args, **rounded_kwargs)
42            return round(res, self.n) if isinstance(res, float) else res15            return round(result, self.n) if isinstance(result, float) el
 >se result
43        return wrapped16        return wrapper
44'\n@Fix(4)\ndef aver(*args, sign=1):\n    return sum(args) * sign\n\npri17'\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'
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op