Why does list.__getitem__ return a list instance for subclasses of the list type?

dackz dackze at gmail.com
Tue Feb 6 11:44:43 EST 2007


>>> class ListyThing(list): pass
...
>>> assert isinstance(ListyThing()[:], ListyThing) # I expect True!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> type(ListyThing()[:]) # I expect ListyThing!
<type 'list'>

I don't find this intuitive. Is this intentional? I believe this could
be avoided if list.__getitem__ used "self.__class__()" to make a new
instance, instead of "list()", but I don't know how that works under
the hood in C.

I believe this happens a lot of other cases too. Actually, I wrote up
some test cases at http://brodierao.com/etc/listslice/ but I haven't
taken a look at it in quite a while. I believe there's some other
funky stuff going on there as well.

Also, this happens with dict too:

>>> class DictyThing(dict): pass
...
>>> assert isinstance(DictyThing().copy(), DictyThing) # I expect True!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> type(DictyThing().copy()) # I expect DictyThing!
<type 'dict'>

Any thoughts?



More information about the Python-list mailing list