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