Confused newbie needs help with "__init__() takes exactly 11 arguments (1 given)"

John Machin sjmachin at lexicon.net
Thu Aug 18 22:34:31 EDT 2005


googleboy wrote:
> I've written a little script to parse a csv file then use seach/replace
> over a template to create a file for each line in the file.  It pikes
> out when I call the function that parses the csv (read_revs).  If I
> have inadvertantly left an extra comma or two in the comma field, it
> gives an error that says:
> 
> Traceback (most recent call last):
>   File
> "C:\dev\python\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py",
> line 310, in RunScript
>     exec codeObject in __main__.__dict__
>   File "d:\dev\python\projects\books\revgen3.py", line 177, in ?
>     gen_html()
>   File "d:\dev\python\projects\books\revgen3.py", line 92, in gen_html
>     revlist =
> read_revs(r'D:\library\work\websites\gobooks\cgi\reviews.csv')
>   File "d:\dev\python\projects\books\revgen3.py", line 38, in read_revs
>     reviews = [Review(*[field.strip() for field in row]) for row in
> reader]
> TypeError: __init__() takes exactly 11 arguments (13 given)
> 
> Which I understand totally, because I can see the two extra fields in
> the csv.  Problem is, if I correct that problem it gives me confusing
> output that is identical except for the final line which says:

How do you "correct" that problem?

> 
> TypeError: __init__() takes exactly 11 arguments (1 given)
> 
> I don't get how it goes from 13 arguments to 1!  I now have 10 fields
> and can understand that it is passing self as the 11th argument.
> 
> Particularly confusing to me was that when I translated this from a
> windows box running Python 2.4 to an OpenBSD box running python 2.3, it
> just worked on the unix box.
> 
> Find below an the code and an example of the csv file in question.
> 
> TIA
> 
> googleboy
> 
> 
> 
> 
> -----
> param1,param2,param3,param4,param5,param6,param7,param8,param9,comments
> data1,data2,data3,data4,data5,data6,data7,data8,data9,Comments on the
> item reviewed go here. Sometime, but not all the time, there might be
> extra commas in this text.
> data1,data2,data3,data4,data5,data6,data7,data8,data9,Comments on the
> item reviewed go here.
> 
> 
> 
> ------
> 
> import string, os, re, sys, operator, csv
> 
> class Review(object):
>     def __init__(self, param1, param2, param3, param4, param5, param6,
> param7, param8, param9, comments):
>         params = locals()
>         del params['self']
>         self.__dict__.update(params)
>     def __repr__(self):
>         all_items = self.__dict__.items()
>         return '%s,%s,%s,%s,%s,%s,%s,%s,%s,%s' % (self.param1,
> self.param2, self.param3, self.param4, self.param5, self.param6,
> self.param7, self.param8, self.param9, self.comments)
> 
> 
> def read_revs(filename):
>     csv_file = open(filename, "rb")
>     reader = csv.reader(csv_file)
>     reviews = [Review(*[field.strip() for field in row]) for row in
> reader]

       so that you can see what you are actually getting as the 1 
argument instead of guessing, try some diagnostics:

reviews = []
for row in reader:
    args = [field.strip() for field in row]
    print "row", repr(row)
    print "args", repr(args)
    reviews.append(Review(*args))

>     csv_file.close()
>     return reviews
> 
> 
> def gen_revs():
> 
>     revlist = read_revs(r'd:\dev\python\projects\books\reviews.csv')
>     revheader = revlist[0]
>     all_reviews = revlist[1:]
> 
>     template = open(r'd:\dev\python\projects\books\template.txt', 'r')
>     sTemplate = template.read()
> 
>     for review in all_reviews:
>         param1 = getattr(review, 'param1')
>         param2 = getattr(review, 'param2')
>         param3 = getattr(review, 'param3')
>         param4 = getattr(review, 'param4')
>         param5 = getattr(review, 'param5')
>         param6 = getattr(review, 'param6')
>         param7 = getattr(review, 'param7')
>         param9 = getattr(review, 'param8')
>         param9 = getattr(review, 'param9')
>         comments = getattr(review, 'comments')
> 
>         output = template % (param1, param2, param3, param4, param5,
> param6, param7, param8, param9, comments)
> 
>         f=open(r"d:\dev\python\projects\books\%s.html" % param1, 'w')
>         f.write(output)
>         f.close()
> 



More information about the Python-list mailing list