Created
April 13, 2013 03:02
-
-
Save shiweifu/5376708 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ConfigDict(dict): | |
''' A dict-subclass with some extras: You can access keys like attributes. | |
Uppercase attributes create new ConfigDicts and act as name-spaces. | |
Other missing attributes return None. Calling a ConfigDict updates its | |
values and returns itself. | |
>>> cfg = ConfigDict() | |
>>> cfg.Namespace.value = 5 | |
>>> cfg.OtherNamespace(a=1, b=2) | |
>>> cfg | |
{'Namespace': {'value': 5}, 'OtherNamespace': {'a': 1, 'b': 2}} | |
''' | |
def __getattr__(self, key): | |
if key not in self and key[0].isupper(): | |
self[key] = ConfigDict() | |
return self.get(key) | |
def __setattr__(self, key, value): | |
if hasattr(dict, key): | |
raise AttributeError('Read-only attribute.') | |
if key in self and self[key] and isinstance(self[key], ConfigDict): | |
raise AttributeError('Non-empty namespace attribute.') | |
self[key] = value | |
def __delattr__(self, key): | |
if key in self: del self[key] | |
def __call__(self, *a, **ka): | |
for key, value in dict(*a, **ka).items(): setattr(self, key, value) | |
return self |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment