Need help with Python scoping rules

Ethan Furman ethan at
Wed Aug 26 21:00:02 CEST 2009

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):
     def fact(recurse, n)	# recurse can be any name you like
         if n < 2:
             return 1
             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.  ;-)


More information about the Python-list mailing list