Python Forum

Full Version: Global - local variables
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
Hello All

I am struggling with using local or global variables. I want to change a variable from 0 to 1 and vis versa within a function when something changes. If I set the variable as a global variable then it is always reset to 0 when the function is called. If I do not declare it globally then it will produce an error of not declared. The other option is to declare it locally before my IF statement but it would then be set to the declared state each time. Hope this makes some sense. The test code is shown below. The If statement is only to be called once, hence the Flag variable

Flag = 0
nuserySWdatabase = 0 # this would be from database but is set to 0 for testing

def nuseryControlFunction(nuserySWdatabase):
    if ( nuserySWdatabase == 0 and Flag == 0):
        print ("pump on")
        Flag = 1
        print Flag
    else:
        print ("pump off")
        Flag = 0

while 1:
    nuseryControlFunction(nuserySWdatabase)
    print Flag
you need to declare it global.
Flag = 0
nuserySWdatabase = 0 # this would be from database but is set to 0 for testing
 
def nuseryControlFunction(nuserySWdatabase):
    global Flag
    if ( nuserySWdatabase == 0 and Flag == 0):
        print ("pump on")
        Flag = 1
        print Flag
    else:
        print ("pump off")
        Flag = 0
 
while 1:
    nuseryControlFunction(nuserySWdatabase)
    print Flag
Yet way way better would for your function to return the flag. If you don't change it inside the function, you can access flag from global scope.

nuserySWdatabase = 0 # this would be from database but is set to 0 for testing
flag = False
def nuseryControlFunction(nuserySWdatabase):
    if nuserySWdatabase == 0 and not flag:
        print("pump on")
        return True
    else:
        print("pump off")
        return False
 
while True:
    flag = nuseryControlFunction(nuserySWdatabase)
    print(flag)
But still better would be to if your function has flag as second parameter (if you need it at all - from your code I cannot decide if it really needed).

nuserySWdatabase = 0 # this would be from database but is set to 0 for testing
flag = False
def nuseryControlFunction(nuserySWdatabase, flag):
    if nuserySWdatabase == 0 and not flag:
        print("pump on")
        return True
    else:
        print("pump off")
        return False
 
while True:
    flag = nuseryControlFunction(nuserySWdatabase, flag)
    print(flag)
Also, note your names do not comply with PEP8 recommendations but I kept them
(Dec-17-2020, 05:31 PM)buran Wrote: [ -> ]you need to declare it global.
Flag = 0
nuserySWdatabase = 0 # this would be from database but is set to 0 for testing
 
def nuseryControlFunction(nuserySWdatabase):
    global Flag
    if ( nuserySWdatabase == 0 and Flag == 0):
        print ("pump on")
        Flag = 1
        print Flag
    else:
        print ("pump off")
        Flag = 0
 
while 1:
    nuseryControlFunction(nuserySWdatabase)
    print Flag
Yet way way better would for your function to return the flag. If you don't change it inside the function, you can access flag from global scope.

nuserySWdatabase = 0 # this would be from database but is set to 0 for testing
flag = False
def nuseryControlFunction(nuserySWdatabase):
    if nuserySWdatabase == 0 and not flag:
        print("pump on")
        return True
    else:
        print("pump off")
        return False
 
while True:
    flag = nuseryControlFunction(nuserySWdatabase)
    print(flag)
But still better would be to if your function has flag as second parameter (if you need it at all - from your code I cannot decide if it really needed).

nuserySWdatabase = 0 # this would be from database but is set to 0 for testing
flag = False
def nuseryControlFunction(nuserySWdatabase, flag):
    if nuserySWdatabase == 0 and not flag:
        print("pump on")
        return True
    else:
        print("pump off")
        return False
 
while True:
    flag = nuseryControlFunction(nuserySWdatabase, flag)
    print(flag)
Also, note your names do not comply with PEP8 recommendations but I kept them

Thanks for the quick reply, I ended up going with the return script as this looks better and makes more sense.

Not sure what the PEP8 naming is, I will have to look this up. Most of my variable naming comes from where I do jQuery and php.

As for not having the Flag in the end I will be adding in time to the ON IF statement so if the pump is on for too long then the program will go into a shutdown status. So within the pump on statement a time of when it comes on will be stored, so this needs to only happen once
(Dec-17-2020, 05:38 PM)Motorhomer14 Wrote: [ -> ]Not sure what the PEP8 naming is
https://www.python.org/dev/peps/pep-0008/
Slight change to your code but at least now it seems to be working

def nuseryControlFunction(nuserySWdatabase, nersFlag):
    if nuserySWdatabase == 0 and nersFlag == False:
        print ("pump on")
      #  GPIO.output(pump, GPIO.LOW)
        offTime = datetime.datetime.now() + datetime.timedelta(seconds=30)
        print offTime
        return True
    if nuserySWdatabase == 1:
        print ("pump off")
      #  GPIO.output(pump, GPIO.HIGH)
        return False
don't do nersFlag == False. nersFlag is bool in itself. not nersFlag is the same as nersFlag == False.
No need (and really doesn't make sense) to compare it to False or True.

Also, it looks like you use python2 (you use print statement on line 6, in which case the brackets on lines 3 and 9 are not needed). But you should switch to python3. python2 is dead, no longer supported as of 1 Jan 2020.
By the way nuserySWdatabase looks like bool too. Is that the case? If is just 0 or 1 you can benefit from reading https://docs.python.org/3/library/stdtyp...ue-testing and again not comparing it to 0 and 1.
(Dec-17-2020, 06:04 PM)buran Wrote: [ -> ]don't do nersFlag == False. nersFlag is bool in itself. not nersFlag is the same as nersFlag == False.
No need (and really doesn't make sense) to compare it to False or True.

Also, it looks like you use python2 (you use print statement on line 6, in which case the brackets on lines 3 and 9 are not needed). But you should switch to python3. python2 is dead, no longer supported as of 1 Jan 2020.
By the way nuserySWdatabase looks like bool too. Is that the case? If is just 0 or 1 you can benefit from reading https://docs.python.org/3/library/stdtyp...ue-testing and again not comparing it to 0 and 1.

Thanks changed that, working ok on this part. Now need to do same with a time variable to shut it down if over run on pump
Dont suppose you would be able to let me know why a time variable when returned is giving the error
'NoneType' object is not iterable

I only get this error when pump is ON. When OFF I get return of zero.


import datetime

nersFlag = False
nuserySWdatabase = 0
nersOffTime = 0

def nuseryControlFunction(nuserySWdatabase, nersFlag, nersOffTime):
    if nuserySWdatabase == 0 and not nersFlag:
        print ("pump on")
      #  GPIO.output(pump, GPIO.LOW)
        nersOffTime = datetime.datetime.now() + datetime.timedelta(seconds=30)
        return True, nersOffTime
    if nuserySWdatabase == 1:
        print ("pump off")
      #  GPIO.output(pump, GPIO.HIGH)
        nersOffTime = 0
        return False, nersOffTime
   # if nersOffTime == now:
      #  print "shutdown"

while True:
    now = datetime.datetime.now()
    nersFlag, nersOffTime = nuseryControlFunction(nuserySWdatabase, nersFlag, nersOffTime)
    print nersOffTime
Post the full traceback you get, in error tags
Ah, what do you think happens when nuserySWdatabase == 0 and nersFlag is True? That will happen when you change flag to True in first iteration. Neither of your conditions is True, so your function returns the default None.

You can visualise execution here and see for yourdelf. http://www.pythontutor.com/visualize.html#mode=edit
Pages: 1 2