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