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