Global - local variables - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Global - local variables (/thread-31538.html) Pages:
1
2
|
Global - local variables - Motorhomer14 - Dec-17-2020 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 RE: Global - local variables - buran - Dec-17-2020 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 FlagYet 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 RE: Global - local variables - Motorhomer14 - Dec-17-2020 (Dec-17-2020, 05:31 PM)buran Wrote: you need to declare it global. 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 RE: Global - local variables - buran - Dec-17-2020 (Dec-17-2020, 05:38 PM)Motorhomer14 Wrote: Not sure what the PEP8 naming ishttps://www.python.org/dev/peps/pep-0008/ RE: Global - local variables - Motorhomer14 - Dec-17-2020 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 RE: Global - local variables - buran - Dec-17-2020 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/stdtypes.html#truth-value-testing and again not comparing it to 0 and 1.
RE: Global - local variables - Motorhomer14 - Dec-17-2020 (Dec-17-2020, 06:04 PM)buran Wrote: don't do 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 RE: Global - local variables - Motorhomer14 - Dec-17-2020 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 RE: Global - local variables - buran - Dec-17-2020 Post the full traceback you get, in error tags RE: Global - local variables - buran - Dec-17-2020 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 |