On Thu, 18 Jan 2006 [EMAIL PROTECTED] wrote:

> Is there a better way?  Thoughts?

I was thinking along these lines:

class NamedTuple(tuple):
        def __init__(self, indices, values):
                "indices should be a map from name to index"
                tuple.__init__(self, values)
                self.indices = indices
        def __getattr__(self, name):
                return self[self.indices[name]]

colourNames = {"red": 0, "green": 1, "blue":2}
plum = NamedTuple(colourNames, (219, 55, 121))

The idea is that it's a tuple, but it has some metadata alongside (shared 
with other similarly-shaped tuples) which allows it to resolve names to 
indices - thus avoiding having two references to everything.

However, if i try that, i get:

Traceback (most recent call last):
   File "<stdin>", line 1, in ?
TypeError: tuple() takes at most 1 argument (2 given)

As far as i can tell, inheriting from tuple is forcing my constructor to 
only take one argument. Is that the case? If so, anyone got any idea why?

If i rewrite it like this:

class NamedTuple(tuple):
        def __init__(self, values):
                tuple.__init__(self, values)
        def __getattr__(self, name):
                return self[self.indices[name]]

class ColourTuple(NamedTuple):
        indices = {"red": 0, "green": 1, "blue":2}

plum = ColourTuple((219, 55, 121))

Then it works. This is even an arguably better style. Changing the 
constructor to take *values rather than values, and to validate the length 
of the value tuple against the length of the index tuple, would be good, 
but, since i'm lazy, is left as an exercise to the reader.

tom

-- 
Throwin' Lyle's liquor away is like pickin' a fight with a meat packing
plant! -- Ray Smuckles
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to