Re: UnboundLocalError - (code is short & simple)

2009-09-28 Thread New User
Thank you for the elaboration, Chris!  I don't have the background to follow 
your example code.  However, between your summary of the code, and the code 
examples themselves, I have enough info to get a glimpse of what you're 
explaining.  Also, I can use the info as a foundation for further study on the 
matter.

Thanks too for the feedback about the "list."  I'm using a combination of yahoo 
email (to and from the mailing list) and Google Groups, until I figure out 
which works best.  Using a Usenet newsreader client is not an option for me at 
this point.

Martin

--- On Mon, 9/28/09, Chris Kaynor  wrote:

From: Chris Kaynor 
Subject: Re: UnboundLocalError - (code is short & simple)
To: python-list@python.org
Date: Monday, September 28, 2009, 4:00 PM

On Sun, Sep 27, 2009 at 10:39 PM, New User  wrote:
Hi Chris,

Thank you for the reply and info!

Re:  "from coin_toss import coin_toss"


My understanding is that this line makes the coin_toss() function in the 
coin_toss.py file available to the toss_winner() function.  Is that what your 
explanation on this point meant (i.e. "... and sets the 
local variable coin_toss to the value of coin_toss in the module coin_toss")?


That is the effect of the statement, however there are cases when the from 
coin_toss import coin_toss may result in a different value in the module. This 
is because:
from coin_toss import coin_tosseffectively does:import coin_tosscoin_toss = 
coin_toss.coin_toss

While this normally works as intended, it can have some unexpected effects. 
Take, for example:

-ALPHA.PY-from gamma import testimport betaimport gamma
test = 2gamma.test = 3print gamma.testprint test
print beta.testprint beta.gamma.test
-BETA.PYfrom gamma import testimport gamma

GAMMA.PY---
test = 1



With this setup, you'll get the output:>>> import Test.alpha321
3


If, however, you change gamma to read:test = ['1']


and the lines in alpha:

test = 2gamma.test = 3
to read:
test.append('2')gamma.test.append('3')
you'll get:
>>> import Test.alpha['1', '2', '3']['1', '2', '3']['1', '2', '3']['1', '2', 
>>> '3']



As this shows, the "from MODULE import VALUE" method rebinds the varible from 
another module in the local scope, and thus does:import MODULE
VALUE = MODULE.VALUEdel MODULE

This means that for some types, the value in MODULE and the value in the local 
scope may not be the same and other times they may be the same.


For your purposes, you'll notice no real difference. However this is something 
to keep in mind.

 

Re:  "... within a function, a different namespace exists ", and "... you 
may want to look into the global keyword ."


Ok, I will read up on these.  Thank you for the tips!

Martin 

P..S.  I didn't see your reply to my post in the comp.lang.python Google 
Groups.  I assume you emailed your reply directly to me.  I also assume you're 
not looking for my response in comp.lang.python Google Groups.  This is my 
first time posting, so I'm not sure what the "posting-reply" conventions are.  


 It should have shown up on the python list - I just forgot to remove you from 
it (I used G-Mail's reply all). In general, unless the reply is off-topic or 
personal, it should be replied to on-list. This allows more people to both see 
the answer and to help further explain the answer.
 

--- On Mon, 9/28/09, Chris Kaynor  wrote:


From: Chris Kaynor 
Subject: Re: UnboundLocalError - (code is short & simple)
To: "pylearner" 

Cc: python-list@python.org
Date: Monday, September 28, 2009, 4:17 AM

Lets look at what is happening on a few of the lines here:

First:from coin_toss import coin_toss


imports the module coin_toss and sets the local variable coin_toss to the value 
of coin_toss in the module coin_toss.





Second:
coin_toss = coin_toss()

calls the function bound to the name coin_toss and assigns the result to 
coin_toss. Now this appears to be what you want (and run outside a function it 
would work as you intend, the first time). However, within a function, a 
different namespace exists, and Python sees that you are assigning to 
coin_toss, and thus uses the local version of that variable everywhere else 
within the function. As such, Python is attempting to call the 
local variable coin_toss, which has not yet been assigned too.







While not really the "correct" solution, you may want to look into the 
global keyword for more information about your problem.







Chris


On Sun, Sep 27, 2009 at 8:53 PM, pylearner  wrote:


Python version = 2.6.1

IDLE

Computer = Win-XP, SP2 (current with all windows updates)



---



Greeti

Re: UnboundLocalError - (code is short & simple)

2009-09-28 Thread New User
Thanks for the light you shed on the "namespace" issue, and for the additional 
info and code example.  I'll be studying more about the info you shared.  Also, 
I tried out your code example, to get firsthand experience with it. 

Cheers,
Martin

--- On Mon, 9/28/09, Bruno Desthuilliers 
 wrote:

From: Bruno Desthuilliers 
Subject: Re: UnboundLocalError - (code is short & simple)
To: python-list@python.org
Date: Monday, September 28, 2009, 8:24 AM

Chris Rebert a écrit :
> On Sun, Sep 27, 2009 at 8:53 PM, pylearner  wrote:
> 
>> ---
>> 
>> Traceback (most recent call last):
>>  File "", line 1, in 
>>    toss_winner()
>>  File "C:/Python26/toss_winner.py", line 7, in toss_winner
>>    coin_toss = coin_toss()
>> UnboundLocalError: local variable 'coin_toss' referenced before
>> assignment
>> 
>> ---
>> 
>> # toss_winner.py
>> 
>> from coin_toss import coin_toss
>> 
>> def toss_winner():
>> 
>>    coin_toss = coin_toss()
> 
> When Python sees this assignment to coin_toss as it compiles the
> toss_winner() function, it marks coin_toss as a local variable and
> will not consult global scope when looking it up at runtime
(snip)
> To fix the problem, rename the variable so its name differs from that
> of the coin_toss() function. 
(snip)


As an additional note: in Python, everything is an object - including modules, 
classes, and, yes, functions -, so there's no distinct namespace for functions 
or classes. If you try to execute the "coin_toss = coin_toss()" statement at 
the top level (or declare name 'coin_toss' global prior using it in the 
toss_winner function), you wouldn't get an UnboundLocalError, but after the 
very first execution of the statement you would probably get a TypeError on 
subsquent attempts to call coin_toss:

>>> def coin_toss():
      print "coin_toss called"
      return 42

>>> coin_toss

>>> coin_toss = coin_toss()
coin_toss called
>>> coin_toss
42
>>> coin_toss()
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'int' object is not callable
>>>



HTH






-- http://mail.python.org/mailman/listinfo/python-list



  -- 
http://mail.python.org/mailman/listinfo/python-list