Skip to content

Instantly share code, notes, and snippets.

@bengolder
Created March 3, 2017 17:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bengolder/7f2e0d52ce2863acd04f738537a31188 to your computer and use it in GitHub Desktop.
Save bengolder/7f2e0d52ce2863acd04f738537a31188 to your computer and use it in GitHub Desktop.
class HumbleCachedContext:
"""Only pulls what it needs, and never pulls twice
"""
def __init__(self, **context_items):
self.get_functions = {}
for key, value in context_items:
self.add(key, value)
def cache_key(self, key):
return '_' + key
def function_key(self, key):
return 'get_' + key
def set(self, key, value):
if hasattr(value, '__call__'):
function_key = self.function_key(key)
self.get_functions[function_key] = value
else:
cache_key = self.cache_key(key)
setattr(self, cache_key, value)
def get(self, key, default_getter=None):
cache_key = self.cache_key(key)
if hasattr(self, cache_key):
return getattr(self, cache_key)
else:
function_key = self.function_key(key)
if function_key in self.get_functions:
value = self.get_functions[function_key]()
setattr(self, cache_key, value)
return value
elif default_getter:
value = default_getter()
setattr(self, cache_key, value)
return value
else:
raise KeyError
def __getattr__(self, key):
return self.get(key)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment