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