R
Rich Healey
I'm trying to write a decorator that causes a function to do nothing
if called more than once- the reason for this is trivial and to see if
I can (Read- I'm enjoying the challenge, please don't ruin it for me
=] )
However I'm getting strange results with Python 2.6.2 on win32.
With this code:
def callonce(func):
def nullmethod(): pass
def __():
return func()
return __
@callonce
def t2():
print "T2 called"
t2()
It does exactly what you'd expect, prints "T2 called"
However:
def callonce(func):
def nullmethod(): pass
def __():
return func()
func = nullmethod
return ret
return __
@callonce
def t2():
print "T2 called"
t2()
Gives me:
C:\tmp\callonce>callonce.py
Traceback (most recent call last):
File "C:\tmp\callonce\callonce.py", line 27, in <module>
t2()
File "C:\tmp\callonce\callonce.py", line 12, in __
return func()
UnboundLocalError: local variable 'func' referenced before assignment
Any ideas on why? This looks like a bug to me, but I'm quite new to
this style of programming so it may be some nuance I'm not aware of.
Thanks in advance.
Rich Healey
if called more than once- the reason for this is trivial and to see if
I can (Read- I'm enjoying the challenge, please don't ruin it for me
=] )
However I'm getting strange results with Python 2.6.2 on win32.
With this code:
def callonce(func):
def nullmethod(): pass
def __():
return func()
return __
@callonce
def t2():
print "T2 called"
t2()
It does exactly what you'd expect, prints "T2 called"
However:
def callonce(func):
def nullmethod(): pass
def __():
return func()
func = nullmethod
return ret
return __
@callonce
def t2():
print "T2 called"
t2()
Gives me:
C:\tmp\callonce>callonce.py
Traceback (most recent call last):
File "C:\tmp\callonce\callonce.py", line 27, in <module>
t2()
File "C:\tmp\callonce\callonce.py", line 12, in __
return func()
UnboundLocalError: local variable 'func' referenced before assignment
Any ideas on why? This looks like a bug to me, but I'm quite new to
this style of programming so it may be some nuance I'm not aware of.
Thanks in advance.
Rich Healey