Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Newbie (but improving) - Passing a function name with parameters as a parameter (http://www.velocityreviews.com/forums/t505433-newbie-but-improving-passing-a-function-name-with-parameters-as-a-parameter.html)

mosscliffe 05-10-2007 08:27 AM

Newbie (but improving) - Passing a function name with parameters as a parameter
 
I am trying to time a function's execution, but I get 'TypeError:
'bool' object is not callable' when I try to run it.

I suspect it is my calling of 'timeloop' with the function name
'lookup' and its associated variables or it could just be some stupid
error on my part.

function 'lookups' was working OK

Any help will be appreciated.

Thanks - Richard

===The offending Code =====


#!/usr/bin/python

def timeloop(dofunction,iters=10):
import datetime
print "->-> Start of test", "LOOPS=", iters,
datetime.datetime.now().ctime()
for x in xrange(iters):
print x
dofunction()
print "<-<- End of test", "LOOPS=", iters,
datetime.datetime.now().ctime()



def lookup(recs,patterns):
matchcount = 0
pattcount = 0
for patt in patterns:
if matchcount < pattcount:
break
pattcount += 1
for rec in recs:
# print "PATT:", patt, " REC:", rec, " PATTCOUNT=", pattcount
if patt in rec:
matchcount +=1
break
# print"MATCHCOUNT=",matchcount, "PATTCOUNT=", pattcount
if matchcount == pattcount:
return True
else:
return False



myrecs = ['This is a title for Brian', 'this is detail one for brian',
'this is detail two for brian', 'this is another detail one for
brian']

test1 = ['one', 'nomatch']
test2 = ['one', 'two']
test3 = ['title', 'two', 'nomatcheither']

mypatts = test1

timeloop(lookup(myrecs,mypatts), 10)


Asun Friere 05-10-2007 09:16 AM

Re: Newbie (but improving) - Passing a function name with parameters as a parameter
 
Try again ...

Just looking over your code quickly ... the function 'lookup' returns
either True or False (a boolean) depending on whether matchcount ==
pattcount. Then in the declaration of the function 'timeloop' this
return value gets bound to 'dofunction.' The subsequent call
'dofunction()' fails, because a boolean is not callable.

Asun


Steffen Oschatz 05-10-2007 10:14 AM

Re: Newbie (but improving) - Passing a function name with parameters as a parameter
 
On 10 Mai, 10:27, mosscliffe <mcl.off...@googlemail.com> wrote:
> I am trying to time a function's execution,


Do you know the timeit module ? : Tool for measuring execution time of
small code snippets

Steffen


Ant 05-10-2007 10:42 AM

Re: Newbie (but improving) - Passing a function name with parameters as a parameter
 
As Stephan said, you can investigate the timeit module. If you want to
test it your way, wrap up your function call in another function:

On May 10, 9:27 am, mosscliffe <mcl.off...@googlemail.com> wrote:
....
> def timeloop(dofunction,iters=10):

....
>
> def lookup(recs,patterns):

....

> myrecs = ...
>

def test1():
lookup(myrecs, ['one', 'nomatch'])

def test2():
lookup(myrecs, ['one', 'two'])

> timeloop(test1, 10)


Using timeit:

t = timeit.Timer("lookup(myrecs, ['one', 'nomatch'])", "from __main__
import *")
print t.timeit(10)

--
Ant.




mosscliffe 05-10-2007 11:25 AM

Re: Newbie (but improving) - Passing a function name with parameters as a parameter
 
Many thanks. I think I see what you mean.

I will try 'timeit' as well.

Aren't examples wonderful ?

On 10 May, 11:42, Ant <ant...@gmail.com> wrote:
> As Stephan said, you can investigate the timeit module. If you want to
> test it your way, wrap up your function call in another function:
>
> On May 10, 9:27 am, mosscliffe <mcl.off...@googlemail.com> wrote:
> ...> def timeloop(dofunction,iters=10):
> ...
>
> > def lookup(recs,patterns):

>
> ...
>
> > myrecs = ...

>
> def test1():
> lookup(myrecs, ['one', 'nomatch'])
>
> def test2():
> lookup(myrecs, ['one', 'two'])
>
> > timeloop(test1, 10)

>
> Using timeit:
>
> t = timeit.Timer("lookup(myrecs, ['one', 'nomatch'])", "from __main__
> import *")
> print t.timeit(10)
>
> --
> Ant.




Terry Reedy 05-10-2007 05:33 PM

Re: Newbie (but improving) - Passing a function name with parametersas aparameter
 

"mosscliffe" <mcl.office@googlemail.com> wrote in message
news:1178785638.736644.312970@e51g2000hsg.googlegr oups.com...

Asun Friere pointed out the central flaw in your program. Since passing
functions as arguments is an important concept, here, for any newbies who
did not understand, is a restatement of the problem and the fix.

| timeloop(lookup(myrecs,mypatts), 10)

This does not pass the lookup function to timeloop. Rather it calls lookup
and passes the boolean result. The attempt to 'call' that boolean gives

|I am trying to time a function's execution, but I get 'TypeError:
| 'bool' object is not callable' when I try to run it.

| I suspect it is my calling of 'timeloop' with the function name
| 'lookup' and its associated variables

Yes. Make the following changes and all should be well.

| def timeloop(dofunction,iters=10):

def timeloop(func, args, iters=10)

| import datetime
| print "->-> Start of test", "LOOPS=", iters,
| datetime.datetime.now().ctime()
| for x in xrange(iters):
| print x
| dofunction()

func(*args)

| print "<-<- End of test", "LOOPS=", iters,
| datetime.datetime.now().ctime()
|
| def lookup(recs,patterns):
| matchcount = 0
| pattcount = 0
| for patt in patterns:
| if matchcount < pattcount:
| break
| pattcount += 1
| for rec in recs:
| # print "PATT:", patt, " REC:", rec, " PATTCOUNT=", pattcount
| if patt in rec:
| matchcount +=1
| break
| # print"MATCHCOUNT=",matchcount, "PATTCOUNT=", pattcount
| if matchcount == pattcount:
| return True
| else:
| return False
|
|
|
| myrecs = ['This is a title for Brian', 'this is detail one for brian',
| 'this is detail two for brian', 'this is another detail one for
| brian']
|
| test1 = ['one', 'nomatch']
| test2 = ['one', 'two']
| test3 = ['title', 'two', 'nomatcheither']
|
| mypatts = test1
|
| timeloop(lookup(myrecs,mypatts), 10)

timeloop(lookup, (myrecs, mypaths), 10)

Terry Jan Reedy




MRAB 05-10-2007 08:48 PM

Re: Newbie (but improving) - Passing a function name with parameters as aparameter
 
On May 10, 6:33 pm, "Terry Reedy" <tjre...@udel.edu> wrote:
> "mosscliffe" <mcl.off...@googlemail.com> wrote in message
>
> news:1178785638.736644.312970@e51g2000hsg.googlegr oups.com...
>
> Asun Friere pointed out the central flaw in your program. Since passing
> functions as arguments is an important concept, here, for any newbies who
> did not understand, is a restatement of the problem and the fix.
>
> | timeloop(lookup(myrecs,mypatts), 10)
>
> This does not pass the lookup function to timeloop. Rather it calls lookup
> and passes the boolean result. The attempt to 'call' that boolean gives
>
> |I am trying to time a function's execution, but I get 'TypeError:
> | 'bool' object is not callable' when I try to run it.
>
> | I suspect it is my calling of 'timeloop' with the function name
> | 'lookup' and its associated variables
>
> Yes. Make the following changes and all should be well.
>
> | def timeloop(dofunction,iters=10):
>
> def timeloop(func, args, iters=10)
>
> | import datetime
> | print "->-> Start of test", "LOOPS=", iters,
> | datetime.datetime.now().ctime()
> | for x in xrange(iters):
> | print x
> | dofunction()
>
> func(*args)
>
> | print "<-<- End of test", "LOOPS=", iters,
> | datetime.datetime.now().ctime()
> |
> | def lookup(recs,patterns):
> | matchcount = 0
> | pattcount = 0
> | for patt in patterns:
> | if matchcount < pattcount:
> | break
> | pattcount += 1
> | for rec in recs:
> | # print "PATT:", patt, " REC:", rec, " PATTCOUNT=", pattcount
> | if patt in rec:
> | matchcount +=1
> | break
> | # print"MATCHCOUNT=",matchcount, "PATTCOUNT=", pattcount
> | if matchcount == pattcount:
> | return True
> | else:
> | return False
> |
> |
> |
> | myrecs = ['This is a title for Brian', 'this is detail one for brian',
> | 'this is detail two for brian', 'this is another detail one for
> | brian']
> |
> | test1 = ['one', 'nomatch']
> | test2 = ['one', 'two']
> | test3 = ['title', 'two', 'nomatcheither']
> |
> | mypatts = test1
> |
> | timeloop(lookup(myrecs,mypatts), 10)
>
> timeloop(lookup, (myrecs, mypaths), 10)
>

A smaller change would be:

timeloop(lambda: lookup(myrecs,mypatts), 10)



All times are GMT. The time now is 04:46 PM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.