У меня есть функция runquery
, которая выполняет вызовы в базу данных, а затем возвращает строки одну за другой. Я написал декоратор Memoize (или, точнее, я только что украл его из этого вопроса о переполнении стека ), но при последующих вызовах он просто возвращает пустую последовательность, предположительно потому, что значения генератора могут быть получены только один раз.
Как я могу изменить декоратор мемоизации, который работает с генераторами Python? Я понимаю, что мне понадобится сохранить его в памяти в какой-то момент, но я бы хотел обработать это в декораторе, а не изменять исходную функцию.
Текущий код функции мемоизации:
def memoized(f):
# Warning: Doesn't work if f yields values
cache={}
def ret(*args):
if args in cache:
return cache[args]
else:
answer=f(*args)
cache[args]=answer
return answer
return ret