Peter R. Fletcher Ответов: 1

Неприятная проблема с кодом Python в приложении flask


The behavior of the following chunk of code has me tearing my hair out! It is from one of the 'routes' in a fairly complex Flask application, which I am writing to schedule Wemo devices. This is only a section of a much longer piece of code, and its purpose is to handle edits to the weekly 'pattern' for turning on (or off) a device at a given time. On the form that it is attached to, each day of the week is represented by a check box. If the name of the relevant checkbox ("Day_0" through "Day_6") exists in request.form (which is a dictionary), the box was checked. If the box was checked when the form was originally displayed, fields['pattern'][n] (where n corresponds to the Day #) is set to 1, if not, it is set to 0. In this code, 'changed' should be set to True if any of the check boxes has changed value.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что код работает так, как он должен работать, если флажок, который был первоначально показан отмеченным, снят пользователем, но не отвечает правильно, если флажок, который был снят, установлен пользователем.
if 'Repeat' in request.form:
    count=0
    for daynum in range(0,7):
        fldname='Day_'+ str(daynum)
        if fldname in request.form:
            flash(fldname + ': ' + str(fields['pattern'][daynum])) # added for debugging
            mypattern.set_day(daynum)
            count +=  1
            if fields['pattern'][daynum] != 1:
                changed=True
                flash('changed should be True') # added for debugging
        elif fields['pattern'][daynum] == 1:
            mypattern.reset_day(daynum)
            changed=True
    if count == 0:
        errors=True
        flash('Repeating actions must repeat on at least one day of the week')
    else:
        action.pattern=mypattern.encode()


Что я уже пробовал:

Я попытался определить, почему тест if терпит неудачу. Самое странное, что вновь установленный флажок обнаружен правильно, и первая отладочная вспышка должным образом появляется при перезагрузке формы. Эта вспышка также правильно сообщает, что соответствующие поля['pattern'][n] имеют значение 0. Однако тест парой строк ниже, который должен быть успешным (так как значение не равно единице), завершается неудачей, и 'changed' не устанавливается в True (а вторая отладочная вспышка не появляется). Может ли кто-нибудь найти в этом хоть какой-то смысл?

1 Ответов

Рейтинг:
2

Peter R. Fletcher

Объяснение странного поведения состояло в том, что содержимое массива fields['pattern'] было изменено, когда я изменил соответствующий параметр в экземпляре класса mypattern, поэтому к тому времени, когда код приступил к его тестированию, он был таким же, как и соответствующий параметр из request.form. Из - за способа написания кода это повлияло на его поведение только тогда, когда ранее отмеченный флажок был снят.

Основная проблема заключалась в том, что при написании класса, экземпляром которого был mypattern, я не учел способ передачи объектов Python: класс сохраняет представление ежедневных настроек для экземпляра во внутреннем bytearray. Функция, которую я использовал для инициализации полей['pattern'], должна была возвращать копию этого массива, но на самом деле возвращала ссылку на внутренний массив экземпляра. Изменение параметра в экземпляре также изменило его в полях['pattern'], так как это фактически указывало на тот же массив. Я не привык к тому, чтобы занятия позволяли тебе делать такие вещи!