UnboundLocalError on global variable

  • Thread starter Konstantinos Pachopoulos
  • Start date
K

Konstantinos Pachopoulos

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,cmitComment,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,projSrcPath,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?
 
G

GuillaumeC

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/07/python-functions-assignments-and-scope.html

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

GuillaumeC

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/07/python-functions-assignments-and-scope.html

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

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,012
Latest member
RoxanneDzm

Latest Threads

Top