Duncan Booth wrote:
/ class CallableOnlyOnce(object):
/ def __init__(self, func): self.func = func def __call__(self): f = self.func if f: self.func = None return f()
/ def callonce(func):
/ return CallableOnlyOnce(func)
/ @callonce
/def t2(): print "T2 called"
/ t2()
/T2 called
/ t2()
/>>>/ / You don't need both the CallableOnlyOnce class and the callonce function. How about the following ... just for fun, it provides the extra functionality of counting the number of times a function was *called*, even though it was *executed* only once: -------------------------- class ExecOnlyOnce(object): def __init__(self, f): print "Making function '%s' into a one-shot" % f.__name__ self.func = f self.func_call_count = 0 def __call__(self): print "Calling one-shot function:", self.func.__name__ self.func_call_count += 1 if self.func_call_count == 1: return self.func() @ExecOnlyOnce def func1(): print " inside original function: func1" return 111 @ExecOnlyOnce def func2(): print " inside original function: func2" return 222 # run the functions # collect return values just once for each function r1 = func1() r2 = func2() func1() func1() func2() func1() # summary print "\nSummary:" for fn in (func1, func2): print "Function '%s' was called %d times" % (fn.func.__name__, fn.func_call_count) print "r1 =", r1 print "r2 =", r2 -------------------------- Output: Making function 'func1' into a one-shot Making function 'func2' into a one-shot Calling one-shot function: func1 inside original function: func1 Calling one-shot function: func2 inside original function: func2 Calling one-shot function: func1 Calling one-shot function: func1 Calling one-shot function: func2 Calling one-shot function: func1 Summary: Function 'func1' was called 4 times Function 'func2' was called 2 times r1 = 111 r2 = 222 -John -- http://mail.python.org/mailman/listinfo/python-list