class NamedTuple(tuple): """Builds a tuple with elements named and indexed. A NamedTuple is constructed with a sequence of (name, value) pairs; the values can then be obtained by looking up the name or the value. """ def __new__(cls, seq): return tuple.__new__(cls, [val for name,val in seq]) def __init__(self, seq): tuple.__init__(self) tuple.__setattr__(self, "_names", dict(zip([name for name,val in seq], range(len(seq))))) def __getattr__(self, name): try: return tuple.__getitem__(self, self.__dict__["_names"][name]) except KeyError: raise AttributeError, "object has no attribute named '%s'" % name def __setattr__(self, name, value): raise TypeError, "'NamedTuple' object has only read-only attributes (assign to .%s)" % name