kj wrote:
I have many years of programming experience, and a few languages,
under my belt, but still Python scoping rules remain mysterious to
me. (In fact, Python's scoping behavior is the main reason I gave
up several earlier attempts to learn Python.)
Here's a toy example illustrating what I mean. It's a simplification
of a real-life coding situation, in which I need to initialize a
"private" class variable by using a recursive helper function.
class Demo(object):
def fact(n):
if n < 2:
return 1
else:
return n * fact(n - 1)
_classvar = fact(5)
As has been pretty thoroughly discussed, the issue here is not
recursion, but name lookup.
Going back through the archives I found Arnaud's post with this decorator:
def bindfunc(f):
def boundf(*args, **kwargs):
return f(boundf, *args, **kwargs)
return boundf
If you use it on your fact function like so...
class Demo(object):
@bindfunc
def fact(recurse, n) # recurse can be any name you like
if n < 2:
return 1
else:
return n * recurse(n-1)
_classvar = fact(5)
del fact # no longer needed, and won't work
# once class is created
This should do as you want.
As a side note, if you're going to bother asking questions on this list,
you really should try to understand the answers. I won't gripe at you
too much, though, 'cause I learned a lot from the many responses given
due to your refusal to do so. ;-)
~Ethan~
--
http://mail.python.org/mailman/listinfo/python-list