Sublassing tuple works, subclassing list does not

Frank Millman frank at chagford.com
Wed Mar 31 02:49:04 EDT 2010


Hi all

I needed something similar to, but not quite the same as, 
collections.namedtuple.

The differences are that namedtuple requires the 'names' to be provided at 
creation time, and then lends itself to creating multiple instances of 
itself. I wanted a more generic class where I could supply the 'names' and 
'values' at instantiation time.

I came up with a simple solution that seems to work -

>>> class MyTuple(tuple):
...   def __new__(cls, names, values):
...     for name, value in zip(names, values):
...       setattr(cls, name, value)
...     return tuple.__new__(cls, values)
...
>>> names = ['A', 'B', 'C']
>>> values = ['a', 'b', 'c']
>>>
>>> tup = MyTuple(names, values)
>>>
>>> print tup
('a', 'b', 'c')
>>>
>>> print tup[0]
a
>>>
>>> print tup.B
b
>>>

Then I had a need to add elements after the tuple had been created. As 
tuples are immutable, I thought it would be easy to change it to a list. 
However, it does not work -

>>> class MyList(list):
...   def __new__(cls, names, values):
...     for name, value in zip(names, values):
...       setattr(cls, name, value)
...     return list.__new__(cls, values)
...
>>> names = ['A', 'B', 'C']
>>> values = ['a', 'b', 'c']
>>>
>>> lst = MyList(names, values)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list() takes at most 1 argument (2 given)
>>>

I can find a workaround, but I would be interested to know the reason why it 
does not work.

Version is 2.6.2.

Thanks

Frank Millman





More information about the Python-list mailing list