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)
This code fails to compile, with the error "global name 'fact' not
defined".
[snip]
fact is defined within the Demo class, so to access it, you'll need to
prefix it with Demo:
_classvar = Demo.fact(5).
The problem is, Demo will raise a NameError exception.
The solution is pretty simple, cause your fact function seems to be
unrelated to the Demo class :
def _fact(n):
# some code
class Demo(object):
_classvar = _fact(5)
It may happen that you *want* your fact within the Demo, in you example
it's not that obvious, but I think Java would allow such following patern:
class Color:
def __init__(self, r, g,b):
pass
BLACK = Color(0,0,0)
It make sens from a design point of view to put BLACK in the Color
namespace. But I don't think it's possible with python.
You could trick the system using inheritance:
class Chrome:
def __init__(self, r,g,b)
pass
Putting all your code in the Chrome class then:
class Color(Chrome):
BLACK = Chrome(0,0,0)
I'm not sure this is satisfying.
JM
--
http://mail.python.org/mailman/listinfo/python-list