Форум сайта python.su
Создать декоратор для функции, которая принимает неограниченное количество позиционных ХЕШИРУЕМЫХ элементов.
Декоратор добавляет следующий функционал:
Если функция уже вызвалась с такими аргументами - ваша функция должна вернуть результат выполнения этой функции из памяти, а не вычислять его заного.
Если не вызывалась - вычислить результат, положить его в память, и вернуть.
Офлайн
1. Сначала сделай декоратор для простой какой-то функции.
2. Потом этот декоратор для простой какой-то функции переделай в декоратор для функции с аргументами.
3. Потом этот декоратор для функции с аргументами переделай в декоратор для функции с неограниченным количеством аргументов.
4. Потом этот декоратор для функции с неограниченным количеством аргументов переделай в декоратор для функции с неограниченным количеством позиционных аргументов.
5. Потом этот декоратор для функции с неограниченным количеством позиционных аргументов переделай в декоратор для функции с неограниченным количеством позиционных хешируемых аргументов.
6. Потом этот декоратор для функции с неограниченным количеством позиционных хешируемых аргументов переделай в декоратор для функции с неограниченным количеством позиционных хешируемых аргументов и с памятью.
Комментарии:
1. 3-й и 4-й пункты сливаются в один.
2. В 5-м пункте используется функция hash(), чтобы определить хешируемость переданного аргумента.
3. В 6-м пункте для памяти используется словарь dict() внутри декоратора ещё до вызова декорируемой функции.
Смысл в том, чтобы разрабатывать программу итеративно - как бы послойно. Это общий принцип разработки, которого нужно придерживаться. Тогда программы будут получаться сами собой и в них не будет каких-то тёмных углов или перекосов.
tags: development iterative
Отредактировано py.user.next (Авг. 3, 2021 00:09:32)
Офлайн
import collections.abc cache = {} def dec(func): def wrapper(*args): if not cache.get(args): a = func(*args) cache[args] = a return a else: return cache[args] return wrapper def check_hash(*args): if not all(isinstance(i, collections.abc.Hashable) for i in args): check = False else: check = args return check @dec def fu(*args): result = args * 2 return result fu(4)
Офлайн
Silos???
Будь я преподаватель то не принял бы ваш код.
У вас половина кода не используется. Считай она просто мусор.
Вы не понимаете назначение функции get. Она нужна для для задания значений по умолчанию.
Если для каких-то аргументов функция вернет None,0,tuple(),…. То хеширования не произойдет. Это прямое нарушение требований задания. Следовательно ваш код неверен.
Отредактировано doza_and (Авг. 8, 2021 09:42:56)
Офлайн
doza_and
Silos???Будь я преподаватель то не принял бы ваш код.У вас половина кода не используется. Считай она просто мусор.Вы не понимаете назначение функции get. Она нужна для для задания значений по умолчанию.Если для каких-то аргументов функция вернет None,0,tuple(),…. То хеширования не произойдет. Это прямое нарушение требований задания. Следовательно ваш код неверен.
Офлайн
doza_and
Silos???Будь я преподаватель то не принял бы ваш код.У вас половина кода не используется. Считай она просто мусор.Вы не понимаете назначение функции get. Она нужна для для задания значений по умолчанию.Если для каких-то аргументов функция вернет None,0,tuple(),…. То хеширования не произойдет. Это прямое нарушение требований задания. Следовательно ваш код неверен.
Офлайн