Объявление глобальной переменной + Unbound Error: локальная переменная, на которую ссылаются перед присвоением? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующий код.Это часть демонстрации расходомера жидкости IoT (отсюда и ссылки GPIO).При запуске функция, кажется, игнорирует, что вращение переменной было определено как глобальная переменная

import RPi.GPIO as GPIO
import time, sys

LIQUID_FLOW_SENSOR = 32

GPIO.setmode(GPIO.BOARD)
GPIO.setup(LIQUID_FLOW_SENSOR, GPIO.IN, pull_up_down = GPIO.PUD_UP)

global rotation
rotation = 0

def countPulse(channel):
   rotation = rotation+1
   print ("Total rotation = "+str(rotation))
   litre = rotation / (60 * 7.5)
   two_decimal = round(litre,3)
   print("Total consumed = "+str(two_decimal)+" Litres")

GPIO.add_event_detect(LIQUID_FLOW_SENSOR, GPIO.FALLING, callback=countPulse)

while True:
    try:
        time.sleep(1)

    except KeyboardInterrupt:
        print 'Program terminated, Keyboard interrupt'
        GPIO.cleanup()
        sys.exit()

Ошибка:

Unbound Error: local variable 'rotation' referenced before assignment

Как объявить переменную глобально безсбросить его на ноль при каждом вызове countPulse?

PS: обратный вызов и переменная канала объясняются здесь: https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Я понял это.В то время как переменная, которую вы намереваетесь определить, сохраняет глобальную область видимости, необходимо отдельно объявить внутри функции, что она имеет глобальную область видимости.Команда «global» не может быть вне функции.

import RPi.GPIO as GPIO
import time, sys

LIQUID_FLOW_SENSOR = 32

GPIO.setmode(GPIO.BOARD)
GPIO.setup(LIQUID_FLOW_SENSOR, GPIO.IN, pull_up_down = GPIO.PUD_UP)

rotation = 0

def countPulse(channel):
   global rotation
   rotation = rotation+1
   print ("Total rotation = "+str(rotation))
   litre = rotation / (60 * 7.5)
   two_decimal = round(litre,3)
   print("Total consumed = "+str(two_decimal)+" Litres")

GPIO.add_event_detect(LIQUID_FLOW_SENSOR, GPIO.FALLING, callback=countPulse)

while True:
    try:
        time.sleep(1)

    except KeyboardInterrupt:
        print 'Program terminated, Keyboard interrupt'
        GPIO.cleanup()
        sys.exit()
0 голосов
/ 04 марта 2019

Просто объявите его глобальным внутри функции.

def countPulse(channel): 
  global rotation 
  rotation = rotation+1
  ...
...