Returning a tuple-struct

Tom Anderson twic at urchin.earth.li
Sat Jan 21 16:21:31 CET 2006


On Thu, 18 Jan 2006 groups.20.thebriguy at spamgourmet.com 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



More information about the Python-list mailing list