Tkinter __call__

James Stroud jstroud at mbi.ucla.edu
Fri Feb 16 15:57:42 EST 2007


Gigs_ wrote:
> James Stroud wrote:
>> Gigs_ wrote:
>>>     def printit(self, name):
>>>         print name, 'returns =>', demos[name]()
>>>
>>>
>>> I have tried but cant get it to work properly.
>>> I want to instead printit method to put __call__ and call it like that
>>> Can someone help me, please?

> I understand lambda, and I know that code is working. But want to do for 
> exercise with __call__. This coed is from programming python 2ed boo

You want to use a function factory that itself defines "__call__"? This 
requires creating a class and not a function.


class printit(object):
   def __init__(self, name):
     self.name = name
   def __call__(self):
     print self.name, 'returns =>', demos[self.name]()

class Demo(Frame):
     def __init__(self, parent=None):
         Frame.__init__(self, parent)
         self.pack()
         Label(self, text="Basic demos").pack()
         for (key, value) in demos.items():
             func = printit(key)
             Button(self, text=key, command=func).pack(side=TOP, fill=BOTH)


However, the functional way (as with lambda) is the most widely used way 
to do this. Another functional way is with closure:

def printit(key):
   def _f():
     print key, 'returns =>', demos[key]()
   return _f

Which behaves identically to the class above. Even more ways to do this 
exist in python, including partial functions--which are also a 
functional approach.

James



More information about the Python-list mailing list