n | """ | n | |
| Спецкурс "Язык программирования Python" (Курячий, осень 2024) | | |
| | | |
| Лекция 11 (18.11) | | |
| Слоты, дескрипторы, декораторы | | |
| | | |
| Задание 3 | | |
| Написать класс-параметрический декоратор Fix(n), с помощью которого все | | |
| вещественные (как позиционные, так и именные) параметры произвольной | | |
| декорируемой функции, а также её возвращаемое значение, округляются до n | | |
| -го | | |
| знака после запятой (1 ⩽ n ⩽ 16). Если какие-то параметры функции оказал | | |
| ись | | |
| не вещественными, или не вещественно возвращаемое значение, эти объекты | | |
| не | | |
| меняются. Обязательно использовать @wraps | | |
| | | |
| | | |
| """ | | |
| 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 |
| | | |
n | def __call__(self, func): | n | def __call__(self, f): |
| | | |
t | @wraps(func) | t | @wraps(f) |
| def wrapped(*args, **kwargs): | | def wrapper(*args, **kwargs): |
| rounded_args = [round(arg, self.n) if isinstance(arg, float) | | round_args = [round(arg, self.n) if isinstance(arg, float) e |
| else arg for arg in args] | | lse arg for arg in args] |
| rounded_kwargs = {k: round(v, self.n) if isinstance(v, float | | round_kwargs = {k: round(v, self.n) if isinstance(v, float) |
| ) else v for k, v in kwargs.items()} | | else v for k, v in kwargs.items()} |
| result = func(*rounded_args, **rounded_kwargs) | | ret = f(*round_args, **round_kwargs) |
| return round(result, self.n) if isinstance(result, float) el | | return round(ret, self.n) if isinstance(ret, float) else ret |
| se result | | |
| return wrapped | | return wrapper |