Named tuples

Bengt Richter bokr at oz.net
Wed Nov 17 23:06:08 EST 2004


On Wed, 17 Nov 2004 23:23:02 -0200, Carlos Ribeiro <carribeiro at gmail.com> wrote:

>On Wed, 17 Nov 2004 17:13:45 -0800, Jeff Shannon <jeff at ccvcorp.com> wrote:
>> Carlos Ribeiro wrote:
>> 
>> >4. Named attribute access is supported by __getattr__. Names are
>> >looked up on the magic __names__ attribute of the tuple.
>> >
>> >5. On slicing, a named tuple should return another named tuple. This
>> >means that the __names__ tuple has to be sliced also.
>> >
>> >
>> 
>> Hm.  If __names__ is a tuple, then does that tuple have a __names__
>> attribute as well?
>> 
>> (In practice, I can't imagine any reason why tuple.__names__.__names__
>> should ever be anything other than None, but the potential recursiveness
>> makes me nervous...)
>
>Humm. The worst case is if it's done in a circular fashion, as in:
>
>mytuple.__names__ = nametuple
>nametuple.__names__ = mytuple
>
>That's weird. The best that I can imagine now is that it would be
>illegal to assign a named tuple to the __names__ member of another
>tuple.
>
>-- 
>Carlos Ribeiro
>Consultoria em Projetos
>blog: http://rascunhosrotos.blogspot.com
>blog: http://pythonnotes.blogspot.com
>mail: carribeiro at gmail.com
>mail: carribeiro at yahoo.com

Just to introduce a different perspective, a viewer for unnamed sequences,
rather than a new type with names:

 >>> class SeqVu(object):
 ...     """create sequence viewer object"""
 ...     def __init__(self, names=''):
 ...         for i, name in enumerate(names.split()):
 ...             setattr(self, name, i)
 ...     def __call__(self, tup):
 ...         """accept tup and return self for named access"""
 ...         self.tup = tup; return self
 ...     def __setitem__(self, i, tup):
 ...         """provide assignment target for tuples to view"""
 ...         self.tup = tup
 ...     def __getattribute__(self, name):
 ...         """get tuple item by name"""
 ...         return object.__getattribute__(self,'tup')[
 ...             object.__getattribute__(self, name)]
 ...
 >>> by3names = SeqVu('zero one two')
 >>> t = range(5)
 >>> by3names(t).one
 1
 >>> by3names(t).two
 2
 >>> for by3names[:] in [(i, chr(i)) for i in xrange(65, 70)]:
 ...     print by3names.one, by3names.zero
 ...
 A 65
 B 66
 C 67
 D 68
 E 69

Think of this as compost for the thought garden, not a bouquet ;-)

Regards,
Bengt Richter



More information about the Python-list mailing list