Function to execute only once

snoe case.nelson at gmail.com
Fri Oct 14 22:34:19 CEST 2005


I've been seeing alot about decorators and closures lately and my
initial thought was that this would be a good place to use them instead
of wrapping it around a class. That was my initial thought :) What I
came up with was this:
def execute_once(fn):
     result = None
     def executor(*args, **kwargs):
         if not result:
            result = fn(*args, **kwargs)
         return result
     return executor

@execute_once
def execute(tmp):
    tmp = tmp+1
    return tmp

def func1(tmp):
    execute(tmp)

def func2(tmp):
    execute(tmp)

tmp=0
print 'init tmp:', tmp
func1(tmp)
print 'ran func1 tmp:', tmp
func2(tmp)
print 'ran func2 tmp:', tmp

It gives the following error:
init tmp: 0
Traceback (most recent call last):
  File "C:\Download\test.py", line 26, in ?
    func1(tmp)
  File "C:\Download\test.py", line 19, in func1
    execute(tmp)
  File "C:\Download\test.py", line 5, in executor
    if not result:
UnboundLocalError: local variable 'result' referenced before assignment

Makes sense to me, except I expected some closure 'magic'. I thought
that when I wrapped executor() inside execute_once() the name result
would be available to executor(). What am I missing here (I expect the
answer to be 'alot') but is this type of solution valid for this
problem?




More information about the Python-list mailing list