Подобные функции - Один работает, остальные нет - Может быть, свежий взгляд может увидеть проблему? (Python CGI)

1

Работа с пользовательской регистрацией с низкой интенсивностью script. В части проверки ошибок script (которая фактически просто проверяет, чтобы поля не оставались пустыми), функция "addressError" работает без каких-либо проблем.

Но если я попытаюсь создать ошибки в любом другом поле, script истечет. Надеюсь, кто-то может понять, что мне не хватает?

Что работает:

def check_address(user, formdata):
        if formdata.has_key("streetAddress") and formdata["streetAddress"].value != "":
                streetAddress = formdata["streetAddress"].value
                return streetAddress
        else:
                addressError(user, formdata)

def addressError(user, formdata):
        feedback = {"blank_address" : "Please enter a valid street address! We won't mail you anything you don't order. Promise."}
        stepTwoError(user, formdata, "blank_address", feedback)

Что не работает:

def check_city(user, formdata):
        if formdata.has_key("city") and formdata["city"].value != "":
                city = formdata["city"].value
                return city
        else:
                cityError(user, formdata)

def cityError(user, formdata):
        feedback = {"blank_city" : "Please enter a city!"}
        stepTwoError(user, formdata, "blank_city", feedback)

def check_state(user, formdata):
        if formdata.has_key("state") and formdata["state"].value != "":
                state = formdata["state"].value
                return state
        else:
                stateError(user, formdata)

def stateError(user, formdata):
        feedback = {"blank_state" : "Please enter a state!"}
        stepTwoError(user, formdata, "blank_state", feedback)

EDIT: Код, который вызывает следующие методы:

def get_stepTwoData(user, formdata):
        firstName, lastName = check_name(user, formdata)
        streetAddress = check_address(user, formdata)
        city = check_city(user, formdata)
        state = check_state(user, formdata)
        zipCode = check_zipCode(user, formdata)

        return firstName, lastName, streetAddress, city, state, zipCode

и в основном:

  if regStep == "2":
                    firstName, lastName, streetAddress, city, state, zipCode = get_stepTwoData(user, formdata)
                    make_step3(user, regStep, firstName, lastName, streetAddress, city, state, zipCode, formdata)

Насколько я понимаю, эти три блока абсолютно одинаковы: "адрес", "состояние" и "город" используются взаимозаменяемо. Фактически, я мог бы написать функцию для включения всех трех из них сразу. Так почему же двое из них не работают?

(Примечание. Я не включаю функцию stepTwoError(), потому что я знаю, что она работает, поскольку она работает после вызова по адресу addressError - поскольку эта функция не изменяется, я знаю, что она работает. Поэтому я могу только предположить проблема заключается в размещенных блоках.)

Если я генерирую данные без ошибок, script выполняется просто отлично, поэтому я не вижу ошибки при чтении данных из формы. Все переменные возвращаются на следующей странице без проблем.

Это преследовало меня целыми днями. Я просто не понимаю. Надеюсь, что проблема будет в том, что я почувствую себя глупо из-за своей простоты.

Спасибо!

EDIT: Хорошо, ошибка, похоже, в моем HTML. Я не понял, что именно в script вызывает ошибку, но в html все формы "input type = 'text' name= '[name]'", за исключением поля адреса, которое является "входным" type = 'text' "- эти лишние пробелы что-то путают.

Спасибо тем, кто ответил терпеливо, и, да, я переписал код, чтобы больше относиться к меньшим возможностям транскрипции.

-Tom

  • 0
    Можете ли вы опубликовать часть кода, которая вызывает эти методы?
  • 0
    Готово. Если ошибки не генерируются, все возвращается без проблем.
Показать ещё 4 комментария
Теги:
cgi
webforms

2 ответа

1
Лучший ответ

У Python есть механизмы для динамического создания функций, которые полезны в таких ситуациях. Один из них - метакласс, который требует некоторого двойного косвенного мышления и может быть извилистым, чтобы думать. Более простой (и степпинг для изучения метаклассов) - это закрытие, функция, которая создает функцию, определяя ее локально, а затем возвращая эту локальную функцию. Вот как вы можете использовать закрытие для генерации всех ваших функций check_xxx:

def check_field(fieldname, errorname, errormessage):
    def fn(user, formdata):
        if fieldname in formdata and formdata[fieldname].value != '':
            return formdata[fieldname].value
        else:
            feedback = {errorname : errormessage}
            stepTwoError(user, formdata, errorname, feedback)
    return fn

check_address = check_field("streetAddress", "blank_address", "Please enter a valid street address!")
check_city = check_field("city", "blank_city", "Please enter a city!")
check_state = check_field("state", "blank_state", "Please enter a state!")
check_zip = check_field("zip", "blank_zip", "Please enter a zip code!")

Закрытие отлично подходит для устранения кодирования вставки и частых ошибок, когда после вставки копии более ранней функции одна или несколько ссылок на имена переменных остаются неизменными от оригинала. Используя закрытие, вы можете быть намного увереннее в том, что ваши отдельные функции действительно являются действительными творениями из исходного шаблона.

Но я согласен с @JohnMachin, я тоже подозреваю, что ваша ошибка действительно находится в известном хорошем и эффективном методе, stepTwoError. Попробуйте оценить свои поля ввода в другом порядке. У параметра stepTwoError есть аргумент по умолчанию, который является изменяемым объектом или списком? Возможно, это считается пустым, но сохраняет значения из предыдущего вызова? Или он обновляет глобальную переменную и оставляет ее в грязном состоянии, что приводит к ошибкам во втором вызове?

  • 0
    Спасибо за подробное переосмысление того, как я это сделал. Я определенно добавлю что-то подобное (это четвертая ревизия или около того, каждый раз, когда я пытался консолидировать код все больше и больше - сначала это было ужасно), и это первый раз, когда я что-то писал вот так (понятно).
  • 0
    stepTwoError вызывает несколько других модулей, которые я создал для переписывания HTML-страниц и вставки ошибок. Он запускается только один раз за вызов основного сценария реестра, а затем переносит пользователя на другую страницу. Другая причина, по которой я не хотел публиковать здесь, заключается в том, что мне также пришлось бы публиковать и все остальные модули, что, я думаю, было бы грубым для всех остальных, но я перейду все это снова. Очередной раз. Если в этих модулях есть ошибки, я их еще не нашел, но буду продолжать пытаться.
0

Эта "логика" ошибочна: "" (Примечание: я не включаю функцию stepTwoError(), потому что я знаю, что она работает, поскольку она работает после вызова addressError - поскольку эта функция не изменяется, я знаю, что это работает "

Все, что вы знаете, это то, что он работает, когда передается "blank_address" в качестве третьего аргумента. Предположим, что он содержит

if third_arg != "blank_address":
    while 1:
        pass

Ещё вопросы

Сообщество Overcoder
Наверх
Меню