Re: python bug when subclassing list? - Python
This is a discussion on Re: python bug when subclassing list? - Python ; 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, ...
-
Re: python bug when subclassing list?
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/
-
Re: python bug when subclassing list?
This is because list() only takes one argument. You will need to pass in an iterable object VS passing in multiple arguments. Technically 'hello', 'goodbye', 1, 'abc', 3 is a tuple (even without the parenthesis), but in a function call, you can't treat it like that. The commas mean something different. You'll need to do this:
Vector((1, 2, 3))
That passes in a tuple.