python bug when subclassing list?

Steve Holden steve at holdenweb.com
Tue Nov 11 21:15:23 EST 2008


Hamish McKenzie wrote:
> I want to write a Vector class and it makes the most sense to just
> subclass list.  I also want to be able to instantiate a vector using either:
> 
>  
> 
> Vector( 1, 2, 3 )
> 
> OR
> 
> Vector( [1, 2, 3] )
> 
>  
> 
>  
> 
> so I have this:
> 
>  
> 
> class Vector(list):
> 
>       def __new__( cls, *a ):
> 
>             try:
> 
>                   print a
> 
>                   return list.__new__(cls, a)
> 
>             except:
> 
>                   print 'broken'
> 
>                   return list.__new__(cls, list(a))
> 
>  
> 
>  
> 
> doing Vector( 1, 2, 3 ) on this class results in a TypeError – which
> doesn’t seem to get caught by the try block (ie “broken” never gets
> printed, and it never tries to
> 
>  
> 
> I can do pretty much the exact same code but inheriting from tuple
> instead of list and it works fine.
> 
>  
> 
> is this a python bug?  or am I doing something wrong?
> 
Vector(1, 2, 3) fails for exactly the same reasons as list:

>>> list(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list() takes at most 1 argument (3 given)

So the behavior you want cannot be inherited from list, since list
doesn't implement that behavior!

As toy our assertion that you can subclass tuple that way, I am inclined
to doubt it because of this:

>>> tuple(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: tuple() takes at most 1 argument (3 given)

regards
 Steve
-- 
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC              http://www.holdenweb.com/




More information about the Python-list mailing list