Having Trouble with Scoping Rules
Fredrik Lundh
fredrik at pythonware.com
Tue Jan 31 00:40:56 EST 2006
Charles Krug wrote:
> > def ExpensiveObject():
> > global _expensiveObject
> > if not(_expensiveObject):
> > _expensiveObject = "A VERY Expensive object"
> >
> > return _expensiveObject
> >
> > The documentation will no doubtedly explain it better than I have
> Okay, that works in the module where I define the function. But if I
> import the module:
>
> # expensive Object User
> import Expensive
>
> print Expensive.ExpensiveObject()
>
> I get the same exception.
not if you followed Farshid's instructions.
> Okay THIS seems to be working for me:
>
> # expensive Object Module
>
> _expensiveObject = None
> def ExpensiveObject():
> try:
> retval = _expensiveObject
> except UnboundLocalError:
> _expensiveObject = "A VERY Expensive object"
> retval = _expensiveObject
>
> return retval
that doesn't work at all:
_expensiveObject = None
def ExpensiveObject():
try:
retval = _expensiveObject
except UnboundLocalError:
_expensiveObject = "A VERY Expensive object"
print "CREATED VERY EXPENSIVE OBJECT"
retval = _expensiveObject
return retval
if __name__ == "__main__":
print _expensiveObject
print ExpensiveObject()
print ExpensiveObject()
print ExpensiveObject()
prints
None
CREATED VERY EXPENSIVE OBJECT
A VERY Expensive object
CREATED VERY EXPENSIVE OBJECT
A VERY Expensive object
CREATED VERY EXPENSIVE OBJECT
A VERY Expensive object
compare this to Farshid's solution:
_expensiveObject = None
def ExpensiveObject():
global _expensiveObject
if _expensiveObject is None:
_expensiveObject = "A VERY Expensive object"
print "CREATED VERY EXPENSIVE OBJECT"
return _expensiveObject
if __name__ == "__main__":
print _expensiveObject
print ExpensiveObject()
print ExpensiveObject()
print ExpensiveObject()
which prints
None
CREATED VERY EXPENSIVE OBJECT
A VERY Expensive object
A VERY Expensive object
A VERY Expensive object
and works perfectly fine if you import it from another module:
>>> import test
>>> print test.ExpensiveObject()
CREATED VERY EXPENSIVE OBJECT
A VERY Expensive object
>>> print test.ExpensiveObject()
A VERY Expensive object
>>> print test.ExpensiveObject()
A VERY Expensive object
> Which gives me:
>
> >>> import Expensive
> >>> a = Expensive.ExpensiveObject()
> >>> b = Expensive.ExpensiveObject()
> >>> a == b
> True
> >>> a is b
> True
> >>>
the only thing you've proved here is that the string constant "A
VERY Expensive object" is the same thing as the string constant
"A VERY Expensive object".
> I'll try it with my actual class instance to verify. Anyone see
> anything I'm missing?
</F>
More information about the Python-list
mailing list