over/over/types.py
2017-10-13 18:23:08 +02:00

59 lines
1.2 KiB
Python

#! /usr/bin/env python3
# encoding: utf-8
from collections import OrderedDict
# --------------------------------------------------
class ndict:
"""
An OrderedDict wrapper whose keys are exposed as attributes.
>>> d = ndict()
>>> d.alpha = 1
>>> d["alpha"]
1
>>> d["beta"] = 42
>>> d.beta
42
>>> d
{"alpha": 1, "beta": 42}
"""
__methods__ = ["values", "items", "keys"]
def __init__(self, *args, **kwargs):
object.__setattr__(self, "d", OrderedDict(*args, **kwargs))
def __repr__(self):
atoms = ["(%s, %s)" %(repr(k), repr(v)) for k, v in self.items()]
return "ndict([" + ", ".join(atoms) + "])"
def __iter__(self):
return self.d.__iter__()
def __getattr__(self, name):
"""
@while looking up an attribute
"""
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.d[name] = value
def __getitem__(self, key):
return self.d[key]
def __setitem__(self, key, value):
self.d[key] = value