Skip to content

Instantly share code, notes, and snippets.

@vodik
Last active August 29, 2015 14:00
Show Gist options
  • Save vodik/9246c65f6ab2a60908e0 to your computer and use it in GitHub Desktop.
Save vodik/9246c65f6ab2a60908e0 to your computer and use it in GitHub Desktop.
A Configurator
class Configurator:
def __init__(self, defaults, parent=None):
self.store = {}
self.parent = parent
for k, v in defaults.items():
self.store[k] = (None, v)
def get(self, key):
try:
setting, default = self.store[key]
except KeyError:
if self.parent:
return self.parent.get(key)
if setting:
return setting
return self.parent.get(key) if self.parent else None
def __getitem__(self, key):
def find(self, key):
try:
setting, default = self.store[key]
except KeyError:
if self.parent:
return find(self.parent, key)
else:
raise
return setting if setting else default
value = self.get(key)
return value if value else find(self, key)
def __setitem__(self, key, value):
try:
_, default = self.store[key]
except KeyError:
default = None
self.store[key] = (value, default)
if __name__ == "__main__":
parent = Configurator({
"foo": "foobar",
"baz": "something else"
})
store = Configurator({ "foo": "replaced foobar" }, parent=parent)
print(store["foo"])
print(store["baz"])
parent["foo"] = "setting foo parent!"
parent["baz"] = "setting baz parent!"
print(store["foo"])
print(store["baz"])
store["baz"] = "setting baz store!"
print(store["foo"])
print(store["baz"])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment