TypeError when subclassing 'list'

looping kadeko at gmail.com
Mon Feb 27 06:36:09 EST 2006


Gerard Flanagan wrote:
> Hello all
>
> Could anyone shed any light on the following Exception? The code which
> caused it is below.  Uncommenting the 'super' call in 'XmlNode' gives
> the same error. If I make XmlNode a subclass of 'object' rather than
> 'list' then the code will run.
>
> Thanks in advance.
>
> Exception:
>
> Traceback (most recent call last):
>   File "C:\Program
> Files\Python\Python24\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py",
> line 310, in RunScript
>     exec codeObject in __main__.__dict__
>   File "C:\Documents and Settings\Gerard\My
> Documents\Scripts\Python\XmlNode\XmlNode.py", line 5, in ?
>     class XmlNode(list):
> TypeError: Error when calling the metaclass bases
>     __init__() takes at most 2 arguments (4 given)
>
> Code:
>
> from elementtree.SimpleXMLWriter import XMLWriter
>
> class XmlNode(list):
>     tag = None
>     attrib = None
>     value = None
>     def __init__(self, tag, **attrib):
>         #super(list, self).__init__()
>         self.tag = tag
>         self.attrib = attrib
>
>     def __repr__(self):
>         return "<XmlNode %s at %x>" % (self.tag, id(self))
>
>     def write(self, writer):
>         writer.start(self.tag, self.attrib)
>         if self.value is not None:
>             writer.data(self.value)
> ##        for node in self:
> ##            node.write(writer)
>         writer.end()
>
> class HtmlElement(XmlNode):
>     def __init__(self, tag, value='', **attrib):
>         super(HtmlElement, self).__init__(tag=tag, **attrib)
>         self.value = value
>
> class li(HtmlElement):
>     def __init__(self, value=None, **attrib):
>         super(li, self).__init__(tag='li', **attrib)
>
> class ul(HtmlElement):
>     def __init__(self, **attrib):
>         super(ul, self).__init__(tag='ul', **attrib)
>
> if __name__ == '__main__':
>     from StringIO import StringIO
>
>     item = li('item')
>     items = ul()
>     #items.apppend(item)
>     out = StringIO()
>     writer = XMLWriter(out)
>     items.write(writer)
>     print
>     print out.getvalue()
>     out.close()

>         #super(list, self).__init__()
I think this line must be:
  super(XmlNode, self).__init__()

But just a guess...




More information about the Python-list mailing list