diff --git a/over/types.py b/over/types.py index ef7a671..db19466 100644 --- a/over/types.py +++ b/over/types.py @@ -5,9 +5,9 @@ from collections import OrderedDict # -------------------------------------------------- -class ndict(OrderedDict): +class ndict: """ - An OrderedDict subclass whose keys are exposed as attributes. + An OrderedDict wrapper whose keys are exposed as attributes. >>> d = ndict() >>> d.alpha = 1 @@ -20,17 +20,38 @@ class ndict(OrderedDict): {"alpha": 1, "beta": 42} """ + __methods__ = ["values", "items"] + + def __init__(self, *args, **kwargs): + object.__setattr__(self, "d", OrderedDict(*args, **kwargs)) + + def __repr__(self): + return "|" + repr(self.d) + + def __iter__(self): + return self.d.__iter__() + def __getattr__(self, name): """ @while looking up an attribute """ - if name in self: - return self[name] - elif name.replace("_", "-") in self: - return self[name.replace("_", "-")] + safe_name = name.replace("_", "-") + + if name in self.__methods__: + return getattr(self.d, name) + if name in self.d: + return self.d[name] + elif safe_name in self.d: + return self.d[safe_name] else: raise AttributeError('"ndict" object has no attribute "%s"' %(name)) def __setattr__(self, name, value): - self[name] = value + self.d[name] = value + + def __getitem__(self, key): + return self.d[key] + + def __setitem__(self, key, value): + self.d[key] = value