Python oferuje bardzo elegancki sposób na zrobienie tego s - dekoratorzy. Zasadniczo dekorator jest funkcją, która owija inną funkcję w celu zapewnienia dodatkowej funkcjonalności bez zmiany kodu źródłowego funkcji. Twój dekorator można zapisać tak:
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
Gdy masz, że „ozdobić” funkcję używając @ -syntax i jesteś gotowy.
@persist_to_file('cache.dat')
def html_of_url(url):
your function code...
Zauważ, że ten dekorator jest celowo uproszczone i nie mogą pracować w każdej sytuacji, na przykład, gdy funkcja zwraca źródło akceptuje lub dane, których nie można json-odcinkach.
Więcej na dekoratorów: How to make a chain of function decorators?
A oto jak zrobić dekorator zaoszczędzić pamięć podręczną tylko raz, w momencie wyjścia:
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
Wystarczy marynarka (lub użyj json) dyktować pamięć podręczną. – root
dzięki, ale jestem początkującym pytonem (drugi dzień). Nie mam najmniejszego pojęcia, co masz na myśli ... – seguso
Dobrze, więc to, co robisz jako początkujący, sprawdza w Google "pyton pikla" i wróć do nas, jeśli masz więcej pytań. –