Named tuples

Graham Fawcett graham.fawcett at gmail.com
Thu Nov 18 13:50:45 EST 2004


Carlos Ribeiro wrote:

> 2. Named tuples should, for all practical purposes, be an extension
of
> standard tuples.

Yes -- and explicitly so. A tuple that has names ought not be a tuple
at all, but rather a tuple subtype. The benefit of adding __names__ as
a tuple attribute is lost on me.

Let's add libraries, not language changes:


class namedtuplewrapper(tuple):
"""
Subclasses wrap existing tuples, providing names.
"""

_names_ = []

def __getattr__(self, name):
try:
x = self._names_.index(name)
except ValueError:
raise AttributeError, 'no such field: %s' % name
if x >= 0:
return self[x]

class namedtuple(namedtuplewrapper):
"""
Sugar for subclasses that construct named tuples from
positional arguments.
"""

def __new__(cls, *args):
return tuple.__new__(cls, args)


if __name__ == '__main__':

# namedtuple example

class foo(namedtuple):
_names_ = ['one', 'two', 'three', 'four', 'five']

f = foo(1, 2, 3, 4, 5)
assert f.one + f.four == f.five == 5


# wrapper example

class loctime(namedtuplewrapper):
_names_ = [
'year', 'month', 'day',
'hour', 'min', 'sec',
'wday', 'yday', 'isdst'
]

import time
loc = loctime(time.localtime())
print loc.year, loc.month, loc.day

# arbitrary naming of instances...
loc._names_ = ['a', 'b', 'c']
        print loc.a


-- Graham




More information about the Python-list mailing list