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

Reply via email to