2015-04-14 4 views
0

Даже после того, как я объявляю переменные глобальными, я получаю эту ошибку, поскольку глобальное имя не определено. Я не уверен, что если бы я объявила переменную глобальной в правильном месте.Python: Не удается разрешить глобальную ошибку переменной

Что я пытаюсь сделать в этой программе из функции lux() Я прочитал необработанные данные с датчика в var. Исходные данные датчика имеют два значения: яркость и ИК. Я назначаю их channel0 и channel1 соответственно. В функции getLux() я использую channel0 и channel1 для вычисления значений усиления.

Пожалуйста, помогите мне решить эту ошибку

#!/usr/bin/python 

import time 
import smbus 

from smbus import SMBus 

address = 0x39 
control = 0x03 
tsl = SMBus(1) 
pause = 0.08 

def lux(): 
    #global channel0 
    #global channel1 
    print "Workking" 
    tsl.write_byte(address, 0x80) 
    tsl.write_byte(address, control) 

    var = [0, 0, 0, 0] 
    var = tsl.read_i2c_block_data(0x39, 0x8d) 
    channel0 = ((var[1]<<8) + var[0]) 
    channel1 = ((var[3]<<8) + var[2]) 

    print "total light %5d  IR light %5d" % (channel0, channel1) 
    time.sleep(2) 
    return (channel0, channel1) 

def setGain(gain): 
    if (gain == 1): 
      tsl.write_byte_data(address, 0x81, 0x01) 
    elif (gain == 16): 
      tsl.write_byte_data(address, 0x81, 0x11) 
    time.sleep(pause) 

def getLux(gain): 
    global channel0 
    global channel1 

    if (gain == 1 or gain == 16): 
      setGain(gain) 
      ambient = lux(channel0) 
      IR = lux(channel1) 

    elif (gain == 0): 
      setGain(16) #first try high gain 
      ambient = channel0 
      if (ambient < 65535): 
        IR = channel1 
      if (ambient >= 65535): 
        setGain(1) #set low gain 
        ambient = channel0 
        IR = channel1 

    if (gain == 1): 
      ambient *= 16 #scale 1x to 16x 
      IR *= 16 

    if (float(ambient == 0)): 
      ratio = 9999 

    else: 
      ratio = (IR/float(ambient)) 

    if (ratio >= 0) & (ratio <= 0.52): 
      tlux = (0.0315 * ambient) - (0.0593 * ambient * (ratio**1.4)) 
    elif (ratio <= 0.65): 
      tlux = (0.299 * ambient) - (0.0291 * IR) 
    elif (ratio <= 0.80): 
      tlux = (0.0157 * ambient) - (0.018 * IR) 
    elif (ratio <= 1.3): 
      tlux = (0.00338 * ambient) - (0.0026 * IR) 
    elif (ratio > 1.3): 
      tlux = 0 

    return tlux 



while True: 

    print "LUX High Gain ", getLux(16) 
    print "LUX Low Gain ", getLux(1) 
    print "LUX AUTO Gain ", getLux() 

Traceback (most recent call last): File "lux2.py", line 85, in <module> print "LUX High Gain ", getLux(16) File "lux2.py", line 45, in getLux ambient = lux(channel0) NameError: global name 'channel0' is not defined

ответ

0

Вы можете назначить channel0 и канал1 в качестве атрибутов функции getLux:

getLux(gain, channel0, channel1) 

Тогда выполнение кода может выглядеть следующим образом:

while True: 
    channels = lux() # This creates a tuple with channel variables 
    print "LUX High Gain ", getLux(16, channels[0], channels[1]) 
    print "LUX Low Gain ", getLux(1, channels[0], channels[1]) 
    print "LUX AUTO Gain ", getLux(0, channels[0], channels[1]) 

Таким образом, вам не нужно будет объявлять их как глобальный, который обычно рассматривается как небезопасная практика.

0

Вы не объявили channel0 в любом месте. Вы объявили его внутри lux(), что не делает его глобальной переменной.

Вы должны объявить его с начальным значением вне всех функциональных областей, здесь:

channel0= 0 
address = 0x39 
control = 0x03 
tsl = SMBus(1) 
pause = 0.08 

И, чтобы изменить его значение, вы должны объявить

global channel0 

внутри лк() функции.

Просто помните о вызове lux(), прежде чем вы вызываете getLux(), в противном случае channel0 всегда будет 0. Также старайтесь не использовать глобальные переменные, так как это считается плохим прайсом программирования.

+0

Hi Rafael, благодарит за ответ. Без использования глобального значения, как я могу вызвать значения channel0 и channel1 из функции lux() для функции getlux()? – Rao

+1

Проблема в том, что вы используете 'channel0' как в функциях 'lux', так и' getLux'. На самом деле это трудно понять. Когда вы вызываете 'ambient = lux (channel0)' в getLux, у вас пока нет значения для channel0. Что означает channel0? 'lux()' объявляется, поскольку ему не нужен какой-либо параметр, однако вы все равно называете его lux (channel0). Это не имеет смысла. Не могли бы вы попытаться отредактировать свой пост, объяснив, что означает эта переменная? – RafaelC

+0

Я редактировал свое сообщение, объясняя, что я пытаюсь сделать. – Rao

0

Проблема, я вижу, что вы не инициализируете глобальную переменную. вам нужно инициализировать глобальную переменную внутри функции getLux.

global channel0 
global channel1 

channel0 = 0 
channel1 = 0 

это решит проблему.

Вместо использования глобальное ключевое слово. вы можете объявить channel0, channel1 глобально доступным, назначьте & переназначить любую функцию.

Смежные вопросы