4

I've recently started to learn how to use python to parse xml files. I took the tutorial from http://pyxml.sourceforge.net/topics/howto/node12.html

When I run the following code I get the error:

Traceback (most recent call last):
  File "C:\Users\Name\Desktop\pythonxml\tutorials\pythonxml\pyxml sourceforge\5.1 Comic Colection\SearchForComic.py", line 30, in -toplevel-
    dh = FindIssue('sandman', '62')
TypeError: __init__() takes exactly 1 argument (3 given)

code:

from xml.sax import saxutils

class FindIssue(saxutils.DefaultHandler):
    def __init___(self, title, number):
        self.search_title, self.search_number = title, number

def startElement(self, name, attrs):
    #if it's not a comic element, ignore it
    if name!= 'comic': return

        # look for the title and number sttributes (see text)
        title = attrs.get('title', None)
        number = attrs.get('number', None)
        if (title == self.search_title and
            number == self.search_number):
                print title, '#' +str (number), 'found'

from xml.sax import make_parser
from xml.sax.handler import feature_namespaces

if __name__ == '__main__':
        #Create a parser
        parser = make_parser()

    #tell the parser that we are not interested in XML namespaces
        parser.setFeature(feature_namespaces, 0)

    #create the handler
    dh = FindIssue('sandman', '62')

    #tell the parse to use our handler
    parser.setContentHandler(dh)

    #parse the input
    parser.parse('collection.xml')

also on the last line I'm passing the file its in the current working directory is this the correct way to address the file?

Ashwini Chaudhary
  • 244,495
  • 58
  • 464
  • 504
Peter Thomas
  • 43
  • 1
  • 4

2 Answers2

8

You've got too many _ in the name of _init_. The declaration of your constructor should be:

def __init__(self, title, number):

not:

def __init___(self, title, number):

Note the extra underscore symbol.

Pavel Chuchuva
  • 22,633
  • 10
  • 99
  • 115
Joe Day
  • 6,965
  • 4
  • 25
  • 26
  • 4
    its a kind of confusing error. As izkata pointed out if `__init__` doesn't exist, python falls back to the default constructor that only takes self as an argument, so python complains about too many arguments to a function you see as having the proper number. – Joe Day Aug 10 '12 at 16:11
4

You have a typo - there's 3 underscores here:

def __init___(self, title, number):

Should be:

def __init__(self, title, number):

Because it doesn't exactly match the name __init__, Python only knows about the default constructor, def __init__(self).

Izkata
  • 8,961
  • 2
  • 40
  • 50