Индекс вне диапазона, только внутри функции python - PullRequest
0 голосов
/ 27 июня 2018

Я действительно не понимаю, что здесь происходит. У меня есть функция:

def get_appliance_status(appliance):
    appliance_data = None
    status_color = SENSOR_STATUS_COLOR_UNKNOWN
    status_message = 'No Appliance Data Available'

    try:
        appliance_data = ApplianceData.objects.filter(appliance=appliance).latest('timestamp')

    except Exception as ex:
        print ex
    else:
        if appliance_data:
            status_color = SENSOR_STATUS_COLOR_OK
            status_message = 'Appliance Temperature and Pressure values are within designed ranges.'
            temperature_status = ''
            pressure_status = ''


            # status of inside box temp and food temps 1-4
            if appliance_data.temperature_4_f > appliance.max_temperature or \
               appliance_data.temperature_5_f > appliance.max_temperature or \
               appliance_data.temperature_6_f > appliance.max_temperature or \
               appliance_data.temperature_7_f > appliance.max_temperature or \
               appliance_data.temperature_8_f > appliance.max_temperature:
                status_color = SENSOR_STATUS_COLOR_WARN
                temperature_status = 'Appliance Temperature is outside designed ranges. '
                status_message = temperature_status

            if est_obj > timestamp + timedelta(minutes=15) or \
               est_obj > timestamp + timedelta(minutes=15) and \
               appliance_data.temperature_4_f > appliance.max_temperature:
                status_color = SENSOR_STATUS_COLOR_CRITICAL
                status_message = "Polar Board Has Lost Connection/Power Failure, Critical"
                #textclient.text(textclient.Brian, "Polar Board has lost connection" + " " + appliance.name)

            if appliance_data.power_1_amps > 0  and \
               appliance_data.power_2_amps == 0:
                status_color = SENSOR_STATUS_COLOR_EMERGENCY
                status_message = "Condenser Motor Fail-Emergency"

            if appliance_data.power_1_amps == 0 and \
               appliance_data.power_2_amps > 0:
                status_color = SENSOR_STATUS_COLOR_EMERGENCY
                status_message = "Compressor Motor Fail-Emergency"  

            if appliance_data.power_1_amps == 0 and \
               appliance_data.power_2_amps == 0 and \
               appliance_data.power_3_amps == 0 and \
               appliance_data.power_4_amps == 0:
                status_color = SENSOR_STATUS_COLOR_EMERGENCY
                status_message = "Power failure- Emergency"

            if appliance_data.pressure_1_psi < 8 and \
               appliance_data.pressure_2_psi < 7 and \
               appliance_data.power_1_amps == 0 and \
               appliance_data.power_2_amps == 0 and \
               appliance_data.power_3_amps > 0 and \
               appliance_data.power_4_amps > 0:
                status_color = SENSOR_STATUS_COLOR_EMERGENCY
                status_message = "No Pressure, Condenser/Compressor failure, Emergency"

            if appliance_data.pressure_1_psi > appliance.max_pressure_1 or \
               appliance_data.pressure_1_psi < appliance.min_pressure_1 or \
               appliance_data.pressure_2_psi > appliance.max_pressure_2 or \
               appliance_data.pressure_2_psi < appliance.min_pressure_2:
                status_color = SENSOR_STATUS_COLOR_WARN
                status_message = ''
                pressure_status = 'Appliance Pressure is outside designed ranges.'
                status_message = ' '.join((temperature_status, pressure_status))

            if appliance_data.power_3_amps == 0 and \
               appliance_data.power_4_amps > 0:
                status_color = SENSOR_STATUS_COLOR_CRITICAL
                status_message = "Evaporator Fan 1 Failure, Critical"

            if appliance_data.power_3_amps > 0 and \
               appliance_data.power_4_amps == 0:
                status_color = SENSOR_STATUS_COLOR_CRITICAL
                status_message = "Evaporator Fan 2 Failure, Critical "


            for item in my_appliance:
                if item.temperature_4_f > appliance.max_temperature:
                    above_temp.append(item.timestamp.astimezone(local_tz).strftime('%H:%M'))
                else:
                    break
            print(above_temp)

    return '<span class="status" style="background-color:' + status_color +';" title="' + status_message + '"></span>'

Проблема заключается здесь:

        above_temp=[]
        for item in my_appliance:
            if item.temperature_4_f > appliance.max_temperature:
               above_temp.append(item.timestamp.astimezone(local_tz)
              .strftime('%H:%M'))
            else:
                break
        print(above_temp)

Если я попытаюсь напечатать above_temp[0], я получу ошибку вне диапазона. Я могу получить доступ к первому элементу с above_temp[0:1]. Тем не менее, это возвращает список этого элемента, это не то, что я хочу. Когда я print(above_temp) получаю [], то после этого я получаю список, который мне нужен. Я действительно хочу первый и последний элемент этого списка. Последний элемент с изменением индекса, основанный на длине списка. Если я запускаю этот же код за пределами функции, он работает как положено. Мне нужно, чтобы запустить внутри этой функции, хотя. Почему он изначально возвращает пустой список и почему я не могу просто использовать индексирование для доступа к элементам внутри этой функции? Вот что я получаю, когда запускаю это:

[]
['11:17', '11:14', '11:12', '11:10', '11:08', '11:06', '11:04', '11:02',
 '11:00', '10:58', '10:56', '10:53', '10:51', '10:49', '10:47', '10:45', 
 '10:43', '10:41', '10:39', '10:37', '10:35', '10:32', '10:30', '10:28', 
 '10:26', '10:24', '10:22', '10:20', '10:18', '10:16', '10:14', '10:11', 
 '10:09', '10:07', '10:05', '10:03', '10:01', '09:59', '09:57', '09:55', 
 '09:53', '09:50', '09:48', '09:46', '09:44', '09:42', '09:40', '09:38', 
 '09:36', '09:34', '09:32', '09:29']

1 Ответ

0 голосов
/ 27 июня 2018

Нарезка списка более мягкая - она ​​работает даже в том случае, если список не содержит элементов, которые вы запрашиваете, в этом случае он вернет пустой список []. Индексирование в список в несуществующем месте вернет ошибку.

Воспроизводится:

tata = [] 

print  tata[0:200] 
try:
    print tata[0] 
except IndexError as idxerr:
    print idxerr 

Выход:

[]
list index out of range

См. Введение в разделе о Строки :

word = 'Python'

Попытка использовать слишком большой индекс приведет к ошибке:

word[42]  # the word only has 6 characters Traceback (most recent call last):   
    File "<stdin>", line 1, in <module> IndexError: string
    index out of range 

Однако индексы срезов вне диапазона обрабатываются изящно при использовании для нарезки:

word[4:42] 'on'
word[42:] ''

Если вам нужно получить доступ к первому и последнему элементу списка, вы можете подумать о следующем:

firstVal, lastVal = above_temp[0:1],above_temp[-1:] # both wont throw error, but 
                                                    # might be [] afterwards

Демо-версия:

tata = [2,3]
firstVal, lastVal = tata[0:1],tata[-1:] 
print firstVal , lastVal

tata = []
firstVal, lastVal = tata[0:1],tata[-1:] 
print firstVal , lastVal

Выход:

[2] [3]
[] []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...