class CacheDict(dict):
    def __init__(self, func):
        super(CacheDict, self).__init__()
        self.func = func

    def __missing__(self, key):
        self[key] = value = self.func(key)
        return value