Frank Millman wrote: > I use a dictionary as a cache, and I thought that I could replace it > with collections.defaultdict, but it does not work the way I expected > (python 3.3.0). > > my_cache = {} > def get_object(obj_id): > if obj_id not in my_cache: > my_object = fetch_object(obj_id) # expensive operation > my_cache[obj_id] = my_object > return my_cache[obj_id] > my_obj = get_object('a') > > I thought I could replace this with - > > from collections import defaultdict > my_cache = defaultdict(fetch_object) > my_obj = my_cache['a'] > > It does not work, because fetch_object() is called without any arguments. > > It is not a problem, but it would be neat if I could get it to work. Am > I missing anything?
You can subclass the ordinary dict: class Cache(dict): def __missing__(self, key): result = self[key] = fetch_object(key) return result _cache = Cache() def get_object(object_id): return _cache[object_id] -- http://mail.python.org/mailman/listinfo/python-list