Overriding list.__new__

Michele Simionato mis6 at pitt.edu
Thu Jul 3 16:46:46 EDT 2003


Let me show first how does it work for tuples:

>>> class MyTuple(tuple):
...     def __new__(cls,strng): # implicit conversion string of ints => tuple
...         return super(MyTuple,cls).__new__(cls,map(int,strng.split()))
>>> MyTuple('1 2')
(1, 2)

No wonder here, everything is fine. However, if I do the same for
lists I get the following:

>>> class MyList(list):
...     def __new__(cls,strng): #implicit conversion string of ints => tuple
...         return super(MyList,cls).__new__(cls,map(int,strng.split()))
>>> MyList('1 2')
['1', ' ', '2']

The same is true for

>>> class MyList(list):
...     def __new__(cls,strng):
...         return list.__new__(cls,map(int,strng.split()))
>>> MyList('1 2')
['1', ' ', '2']

therefore it is not a problem of super.
The 'map' expression does not seem to be executed or, if its executed, 
it has no effect at all. If I replace 'map' with anything, still I have 
the same result:

>>> class MyList(list):
...     def __new__(cls,strng):
...         return list.__new__(cls,map(int,[]) # !notice: empty list here!
>>> MyList('1 2')
['1', ' ', '2']

In other words I always get the result of

>>> list('1 2')
['1', ' ', '2']

and it seems impossible to override list.__new__.

I am very puzzled about that; any suggestions?

                 Michele




More information about the Python-list mailing list