Python предлагает очень элегантный способ сделать это s - декораторы. В принципе, декоратор - это функция, которая обертывает другую функцию для обеспечения дополнительной функциональности без изменения исходного кода функции. Ваш декоратор можно записать так:
import json
def persist_to_file(file_name):
def decorator(original_func):
try:
cache = json.load(open(file_name, 'r'))
except (IOError, ValueError):
cache = {}
def new_func(param):
if param not in cache:
cache[param] = original_func(param)
json.dump(cache, open(file_name, 'w'))
return cache[param]
return new_func
return decorator
После того, как вы получили, что, «украсить» функцию с помощью @ -syntax и вы будете готовы.
@persist_to_file('cache.dat')
def html_of_url(url):
your function code...
Обратите внимание, что этот декоратора намеренно упрощена и может не работать в любой ситуации, например, когда функция источника принимает или возвращает данные, которые не могут быть JSON-сериализации.
Подробнее о декораторов: How to make a chain of function decorators?
А вот как сделать декоратор сохранить кэш только один раз, во время выхода:
import json, atexit
def persist_to_file(file_name):
try:
cache = json.load(open(file_name, 'r'))
except (IOError, ValueError):
cache = {}
atexit.register(lambda: json.dump(cache, open(file_name, 'w')))
def decorator(func):
def new_func(param):
if param not in cache:
cache[param] = func(param)
return cache[param]
return new_func
return decorator
Просто разберите (или используйте json) тайник. – root
спасибо, но я новичок python (второй день). Я не имею ни малейшего представления о том, что вы имеете в виду ... – seguso
Хорошо, поэтому то, что вы делаете в качестве новичков, - это поиск пива «pickle python» в Google и возвращайтесь к нам, если у вас есть еще вопросы. –