local variable referenced before assignment

Discussion in 'Python' started by Pete Bartonly, Oct 25, 2007.

  1. Quick question, probably quite a simple matter. Take the follow start of
    a method:


    def review(filesNeedingReview):

    for item in filesNeedingReview:
    (tightestOwner, logMsg) = item

    if (logMsg != None):
    for logInfo in logMsg.changed_paths:


    This generates the error:

    UnboundLocalError: local variable 'logMsg' referenced before assignment

    I thought I'd assigned it in the "(tightestOwner, logMsg) = item" line -
    so in the python interpreter complaining about the fact this assignment
    might not go well?

    Thanks!
     
    Pete Bartonly, Oct 25, 2007
    #1
    1. Advertising

  2. Pete Bartonly

    A.T.Hofkamp Guest

    On 2007-10-25, Pete Bartonly <> wrote:
    >
    > Quick question, probably quite a simple matter. Take the follow start of
    > a method:
    >
    >
    > def review(filesNeedingReview):
    >
    > for item in filesNeedingReview:
    > (tightestOwner, logMsg) = item
    >
    > if (logMsg != None):
    > for logInfo in logMsg.changed_paths:
    >
    >
    > This generates the error:
    >
    > UnboundLocalError: local variable 'logMsg' referenced before assignment


    This should work, are you sure you didn't make a typo in one of the names?

    Another way to make this fail would be when the if-condition is outside
    the loop (is the indentation correct in your code?).

    A short demontration:
    >>> def r(fnr):

    .... for item in fnr:
    .... w,m = item
    .... if m == 2:
    .... print w
    ....
    >>> fnr = [(1,2), (3,4)]
    >>> r(fnr)

    1

    With respect to compactness and style, you can move your multi-assignment
    statement in the for loop, as in

    for tightestOwner, logMsg in filesNeedingReview:

    Also, brackets around conditions (in the if) are not needed, and comparing
    against None is usually done with 'is' or 'is not' instead of '==' or '!='.
    The result is then

    if logMsg is not None:


    > I thought I'd assigned it in the "(tightestOwner, logMsg) = item" line -
    > so in the python interpreter complaining about the fact this assignment
    > might not go well?


    No, you'd get an error at that point in that case.


    Sincerely,
    Albert
     
    A.T.Hofkamp, Oct 25, 2007
    #2
    1. Advertising

  3. Pete Bartonly

    Peter Otten Guest

    Pete Bartonly wrote:

    > Quick question, probably quite a simple matter. Take the follow start of
    > a method:
    >
    >
    > def review(filesNeedingReview):
    >
    > for item in filesNeedingReview:
    > (tightestOwner, logMsg) = item
    >
    > if (logMsg != None):
    > for logInfo in logMsg.changed_paths:
    >
    >
    > This generates the error:
    >
    > UnboundLocalError: local variable 'logMsg' referenced before assignment
    >
    > I thought I'd assigned it in the "(tightestOwner, logMsg) = item" line -
    > so in the python interpreter complaining about the fact this assignment
    > might not go well?


    My crystal ball tells me that you are not posting the actual code where
    for... and if... are indented to the same level. This triggers the error
    when review() is called with an empty sequence.

    Please remember to copy and paste both code and traceback next time.

    Peter
     
    Peter Otten, Oct 25, 2007
    #3
  4. On Oct 25, 10:02 am, Pete Bartonly <> wrote:
    > Quick question, probably quite a simple matter. Take the follow start of
    > a method:
    >
    > def review(filesNeedingReview):
    >
    > for item in filesNeedingReview:
    > (tightestOwner, logMsg) = item
    >
    > if (logMsg != None):
    > for logInfo in logMsg.changed_paths:
    >
    > This generates the error:
    >
    > UnboundLocalError: local variable 'logMsg' referenced before assignment


    Check your indentation?
    Seems to me that you might really have:

    def review(...):
    for ...:
    ....
    if (logMsg...):
    ....

    HTH

    --
    Arnaud
     
    Arnaud Delobelle, Oct 25, 2007
    #4
  5. Pete Bartonly

    Tim Williams Guest

    On 25/10/2007, A.T.Hofkamp <> wrote:
    > On 2007-10-25, Pete Bartonly <> wrote:
    > >

    > Also, brackets around conditions (in the if) are not needed, and comparing
    > against None is usually done with 'is' or 'is not' instead of '==' or '!='.
    > The result is then
    >
    > if logMsg is not None:


    Or just

    >>> if logMsg:

    do_something()

    :)
     
    Tim Williams, Oct 25, 2007
    #5
  6. Pete Bartonly

    A.T.Hofkamp Guest

    On 2007-10-25, Tim Williams <> wrote:
    > On 25/10/2007, A.T.Hofkamp <> wrote:
    >> On 2007-10-25, Pete Bartonly <> wrote:
    >> >

    >> Also, brackets around conditions (in the if) are not needed, and comparing
    >> against None is usually done with 'is' or 'is not' instead of '==' or '!='.
    >> The result is then
    >>
    >> if logMsg is not None:

    >
    > Or just
    >
    >>>> if logMsg:

    > do_something()
    >
    >:)


    That is not the same.

    If logMsg is 0, False, or empty string, the second variant
    would be False and not True.

    Albert
     
    A.T.Hofkamp, Oct 25, 2007
    #6
  7. A.T.Hofkamp wrote:
    > On 2007-10-25, Pete Bartonly <> wrote:
    >> Quick question, probably quite a simple matter. Take the follow start of
    >> a method:
    >>
    >>
    >> def review(filesNeedingReview):
    >>
    >> for item in filesNeedingReview:
    >> (tightestOwner, logMsg) = item
    >>
    >> if (logMsg != None):
    >> for logInfo in logMsg.changed_paths:
    >>
    >>
    >> This generates the error:
    >>
    >> UnboundLocalError: local variable 'logMsg' referenced before assignment

    >
    > This should work, are you sure you didn't make a typo in one of the names?


    Nope, the above is verbatim. This is why I'm so confused. It should
    work! I'm editing in emacs, and the indents are tab chars. I've
    re-indented the indents using 'tab' key - same result.

    The entire error output is this:

    Traceback (most recent call last):
    File "checkCode.py", line 602, in ?
    analyseFiles(tempDir)
    File "checkCode.py", line 448, in analyseFiles
    analyseFilesInARepos(startDir, f)
    File "checkCode.py", line 590, in analyseFilesInARepos
    makeReport(projName, filesNeedingReview, filesFailedReview)
    File "checkCode.py", line 422, in makeReport
    for logInfo in logMsg.changed_paths:
    UnboundLocalError: local variable 'logMsg' referenced before assignment

    I'm rather stuck at what to try next!

    thanks.
    Pete







    >
    > Another way to make this fail would be when the if-condition is outside
    > the loop (is the indentation correct in your code?).
    >
    > A short demontration:
    >>>> def r(fnr):

    > ... for item in fnr:
    > ... w,m = item
    > ... if m == 2:
    > ... print w
    > ...
    >>>> fnr = [(1,2), (3,4)]
    >>>> r(fnr)

    > 1
    >
    > With respect to compactness and style, you can move your multi-assignment
    > statement in the for loop, as in
    >
    > for tightestOwner, logMsg in filesNeedingReview:
    >
    > Also, brackets around conditions (in the if) are not needed, and comparing
    > against None is usually done with 'is' or 'is not' instead of '==' or '!='.
    > The result is then
    >
    > if logMsg is not None:
    >
    >
    >> I thought I'd assigned it in the "(tightestOwner, logMsg) = item" line -
    >> so in the python interpreter complaining about the fact this assignment
    >> might not go well?

    >
    > No, you'd get an error at that point in that case.
    >
    >
    > Sincerely,
    > Albert
     
    Pete Bartonly, Oct 25, 2007
    #7
  8. A.T.Hofkamp wrote:
    > On 2007-10-25, Pete Bartonly <> wrote:
    >> Quick question, probably quite a simple matter. Take the follow start of
    >> a method:


    > With respect to compactness and style, you can move your multi-assignment
    > statement in the for loop, as in

    [snip]

    Btw, thanks for the tips on style too!
    Pete
     
    Pete Bartonly, Oct 25, 2007
    #8
  9. Peter Otten wrote:
    > Pete Bartonly wrote:
    >
    >> Quick question, probably quite a simple matter. Take the follow start of
    >> a method:
    >>
    >>
    >> def review(filesNeedingReview):
    >>
    >> for item in filesNeedingReview:
    >> (tightestOwner, logMsg) = item
    >>
    >> if (logMsg != None):
    >> for logInfo in logMsg.changed_paths:
    >>
    >>
    >> This generates the error:
    >>
    >> UnboundLocalError: local variable 'logMsg' referenced before assignment
    >>
    >> I thought I'd assigned it in the "(tightestOwner, logMsg) = item" line -
    >> so in the python interpreter complaining about the fact this assignment
    >> might not go well?

    >
    > My crystal ball tells me that you are not posting the actual code where
    > for... and if... are indented to the same level.


    I am! See my other reply just now.

    Here it the code again, directly cut and pasted from emacs:

    for item in filesNeedingReview:
    (tightestOwner, logMsg) = item

    if (logMsg != None):
    for logInfo in logMsg.changed_paths:
    if (not tightestOwner in emailListForReviewers):
    emailListForReviewers.append(tightestOwner)




    This triggers the error
    > when review() is called with an empty sequence.
    >
    > Please remember to copy and paste both code and traceback next time.


    Sorry 'bout that. The traceback I forgot is:

    Traceback (most recent call last):
    File "checkCode.py", line 599, in ?
    analyseFiles(tempDir)
    File "checkCode.py", line 445, in analyseFiles
    analyseFilesInARepos(startDir, f)
    File "checkCode.py", line 587, in analyseFilesInARepos
    makeReport(projName, filesNeedingReview, filesFailedReview)
    File "checkCode.py", line 419, in makeReport
    for logInfo in logMsg.changed_paths:
    UnboundLocalError: local variable 'logMsg' referenced before assignment


    Pete
     
    Pete Bartonly, Oct 25, 2007
    #9
  10. Pete Bartonly wrote:
    >
    > Quick question, probably quite a simple matter. Take the follow start of
    > a method:
    >
    >
    > def review(filesNeedingReview):
    >
    > for item in filesNeedingReview:
    > (tightestOwner, logMsg) = item
    >
    > if (logMsg != None):
    > for logInfo in logMsg.changed_paths:
    >
    >
    > This generates the error:
    >
    > UnboundLocalError: local variable 'logMsg' referenced before assignment
    >
    > I thought I'd assigned it in the "(tightestOwner, logMsg) = item" line -
    > so in the python interpreter complaining about the fact this assignment
    > might not go well?
    >
    > Thanks!


    Argh! Mea culpa everyone!
    Turns out that there is a similar few lines of code later on in the
    code. I was confusing which was which. (I was using meta-x goto-line but
    then looking at the wrong but somehow, as it appeared on the same screen
    in emacs.)
    So the error was occuring at a similar line in the code, but one at
    whihc logMsg *wasn't* being set beforehand.

    Sorry all, thanks for your help, appreciate it!
    Pete
     
    Pete Bartonly, Oct 25, 2007
    #10
  11. On Thu, 25 Oct 2007 16:58:58 +0100, Pete Bartonly <>
    declaimed the following in comp.lang.python:

    > >>
    > >> def review(filesNeedingReview):


    ^^^^^^^^^^^^^^^^^^

    > Here it the code again, directly cut and pasted from emacs:
    >

    Better

    > for item in filesNeedingReview:
    > (tightestOwner, logMsg) = item
    >
    > if (logMsg != None):
    > for logInfo in logMsg.changed_paths:
    > if (not tightestOwner in emailListForReviewers):
    > emailListForReviewers.append(tightestOwner)


    > Traceback (most recent call last):
    > File "checkCode.py", line 599, in ?
    > analyseFiles(tempDir)
    > File "checkCode.py", line 445, in analyseFiles
    > analyseFilesInARepos(startDir, f)
    > File "checkCode.py", line 587, in analyseFilesInARepos
    > makeReport(projName, filesNeedingReview, filesFailedReview)
    > File "checkCode.py", line 419, in makeReport

    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    > for logInfo in logMsg.changed_paths:
    > UnboundLocalError: local variable 'logMsg' referenced before assignment
    >

    Obviously the first post was NOT cut&paste, since the function names
    (and parameter signature) have changed...

    Given that, I'd suggest 'tis time to strip down to the absolute
    minimum code that still produces the error...
    --
    Wulfraed Dennis Lee Bieber KD6MOG

    HTTP://wlfraed.home.netcom.com/
    (Bestiaria Support Staff: )
    HTTP://www.bestiaria.com/
     
    Dennis Lee Bieber, Oct 25, 2007
    #11
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Peter Moscatt
    Replies:
    2
    Views:
    9,823
    Peter Moscatt
    Mar 19, 2005
  2. Replies:
    2
    Views:
    5,307
    Diez B. Roggisch
    Feb 26, 2006
  3. Gabriel Rossetti
    Replies:
    3
    Views:
    969
    Hrvoje Niksic
    Dec 9, 2009
  4. johngilbrough

    local variable referenced before assignment

    johngilbrough, Apr 4, 2010, in forum: Python
    Replies:
    5
    Views:
    1,269
    Steven D'Aprano
    Apr 6, 2010
  5. ch1zra
    Replies:
    9
    Views:
    3,115
    danieldelay
    Jun 8, 2010
Loading...

Share This Page