472,143 Members | 1,527 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,143 software developers and data experts.

UnboundLocalError on global variable

Hi,
i have a problem, the source of which is probably the fact, that i have
not understood how to declare global variables - I use the Jython
compiler, but i think this is a Python issue...

First of all, i don not use any classes in this module. The problem is,
that i declare and instantiate some vars outside the functions (global
ones), but when i use them inside the functions, i get an
"UnboundLocalError" error.

Here's the interesting part of the code:

================================================== ========================================
#imports
....

#CONSTANTS
......
....
#connection to DB
dbcursor_=db.cursor()

#GLOBAL VARS
entryList_={}
cmterID_=0 //VARIABLE DECLARATION
projID_=0
fileIDNumber_=0
Commiter_={}
Commit_={}
Project_={}
ProjectVersion_={}
def updateCommiterTable(Commiter):
query="INSERT INTO Commiter (pk_cmterID,cmterName) VALUES
("+str(Commiter[0])+",\""+str(Commiter[1])+"\");"
dbcursor_.execute(query)
def updateCommitTable(Commit):
query="INSERT INTO Commit
(pk_cmitID,cmitTime,fk_cmterID,cmitProperties,cmit Comment,cmitCommentLines,fk_projID)
VALUES (" \

+str(Commit[0])+",\""+str(Commit[1])+"\","+str(Commit[2])+",\""+str(Commit[3])+"\",\""+str(Commit[4])+"\","+str(Commit[5])+","+str(Commit[6])+");"
dbcursor_.execute(query)
def updateProjectTable(Project):
dbcursor_.execute("INSERT INTO Project
(pk_projID,projName,projWebsite,projContactPoint,p rojSrcPath,projMailPath)
VALUES (" \

+str(Project[0])+",\""+str(Project[1])+"\",\""+str(Project[2])+"\",\""+str(Project[3])+"\",\""+str(Project[4])+"\",\""+str(Project[5])+"\");")
def updateProjectVersionTable(ProjectVersion):
dbcursor_.execute("INSERT INTO ProjectVersion
(pfk_projID,projName,projVersion) VALUES (" \

+str(ProjectVersion[0])+",\""+str(ProjectVersion[1])+"\",\""+str(ProjectVersion[2])+"\");");

def getLogsLoop():

while
svnLogging_.getCurrentRevisionNumber()!=svnLogging _.getLatestRevisionNumber():
try:
entryList_=svnLogging_.getNextLogs(PIVOT);
except HeadRevisionReachedException:
print "Attempting to go over the HEAD revision..."

for entry in entryList_:
print "processing new SVN entry..."
processLogEntry(entry)

entryList_.clear()
def processLogEntry(entry):
revision = int(entry.getRevision())
commiter = str(entry.getAuthor())
datetime = getTimeStamp(entry.getDate())
message = str(entry.getMessage())

Commiter_[0] = cmterID_ //HERE's THE PROBLEM
Commiter_[1] = commiter
updateCommiterTable(Commiter_)
Commit_[0] = revision
Commit_[1] = datetime
Commit_[2] = cmterID_
Commit_[3] = "" #properties
Commit_[4] = message
Commit_[5] = getNumberOfLines(message)
Commit_[6] = projID_
updateCommitTable(Commit_)

ProjectVersion_[0]=projID_
ProjectVersion_[1]=""
ProjectVersion_[2]=""
updateProjectVersionTable(ProjectVersion_)

Project_[0]=projID_
Project_[1]=""
Project_[2]=""
Project_[3]=""
Project_[4]=""
Project_[5]=""
updateProjectTable(Project_)

cmterID_+=1
projID_+1

##############################HELPER##METHODS##### ##########################

....
##############################HELPER##METHODS##### ##########################
getLogsLoop()
================================================== ========================================
And I get:
================================================== ========================================
Traceback (innermost last):
File "ParseSVN2DB.py", line 182, in ?
File "ParseSVN2DB.py", line 87, in getLogsLoop
File "ParseSVN2DB.py", line 100, in processLogEntry
UnboundLocalError: local: 'cmterID_'
================================================== ========================================

The things is, that cmterID_ HAS BEEN instantiated... I don't understand.
Can somebody please explain?
Sep 9 '07 #1
2 1977
def processLogEntry(entry):
# ADD THIS TO YOUR CODE
global cmterID_
>
revision = int(entry.getRevision())
commiter = str(entry.getAuthor())
datetime = getTimeStamp(entry.getDate())
message = str(entry.getMessage())

Commiter_[0] = cmterID_ //HERE's THE PROBLEM
The reason why it does not work is that there is an assignment to
cmterID_ in your function - even if it is after the problem. As a
consequence, the bytecode compiler makes this name local, and the name
is unbound. The quick fix is to add the global statement as above.

There is a good explanation here:
http://paddy3118.blogspot.com/2006/0...and-scope.html

May I suggest that you use less global variables, for instance
enclosing your method in a class?

Sep 9 '07 #2
def processLogEntry(entry):
# ADD THIS TO YOUR CODE
global cmterID_
>
revision = int(entry.getRevision())
commiter = str(entry.getAuthor())
datetime = getTimeStamp(entry.getDate())
message = str(entry.getMessage())

Commiter_[0] = cmterID_ //HERE's THE PROBLEM
The reason why it does not work is that there is an assignment to
cmterID_ in your function - even if it is after the problem. As a
consequence, the bytecode compiler makes this name local, and the name
is unbound. The quick fix is to add the global statement as above.

There is a good explanation here:
http://paddy3118.blogspot.com/2006/0...and-scope.html

May I suggest that you use less global variables, for instance
enclosing your method in a class?

Sep 9 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

3 posts views Thread by Brad Clements | last post: by
6 posts views Thread by Alex Gittens | last post: by
2 posts views Thread by silverburgh.meryl | last post: by
8 posts views Thread by David Bear | last post: by
15 posts views Thread by Paddy | last post: by
9 posts views Thread by Camellia | last post: by
reply views Thread by Terry Reedy | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.