Доступ к неизвестным аргументам запроса в Python

Я использую Jinja2 для создания формы с переменным количеством входных данных, помеченных как input_1, input_2 и т. д. Затем, используя Google App Engine (python), я пытаюсь получить доступ к значениям этих входов в моем обработчике запросов, используя self.request.args.get().

Однако, в зависимости от количества входных данных, сгенерированных формой, сценарию необходимо прочитать несколько переменных. Сценарий знает, сколько их будет, поэтому вопрос заключается в том, как использовать какую-то переменную переменную в цикле for, чтобы эффективно прочитать их все.

То, что мне нужно, концептуально выглядит так:

for x in total_inputs:
  list.append(input_x)

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

Большое спасибо


person Cerzi    schedule 07.07.2011    source источник
comment
Можете уточнить свой вопрос? Я вижу, что кто-то проголосовал за ответ @Hyperboreus, но я бы тоже понял ваш вопрос так же, как она / он ...?   -  person mac    schedule 07.07.2011
comment
Кроме того, из заголовка вы говорите неизвестные имена переменных, но что возвращает self.request.args.get()? Можете ли вы опубликовать SSCCE пример кода, который вас беспокоит?   -  person mac    schedule 07.07.2011
comment
@мак 20кб? Я думаю, что ваша ссылка отключена на порядки из-за переполнения стека. И то, о чем он спрашивает, кажется мне совершенно ясным, контекстуально.   -  person Nick Johnson    schedule 07.07.2011
comment
@Nick - ТАК - это не форум Usenet! :) Что касается ясности, я рад, что вы поняли, но весь смысл публикации на SO состоит в том, чтобы охватить широкую аудиторию, поэтому было бы в интересах ОП, если бы его / ее вопрос был ясен для всех ( или, по крайней мере, понятно как можно большему количеству людей).   -  person mac    schedule 07.07.2011
comment
@mac Это должно быть ясно любому, кто использует инфраструктуру, подобную веб-приложению, в App Engine (или вне ее, на самом деле) - он пытается получить последовательно пронумерованные поля из сообщения формы. Я не уверен, как он мог уточнить, чтобы сделать это более ясным.   -  person Nick Johnson    schedule 07.07.2011
comment
@Ник - Как ты это сделал? :o Или с примером? Вопрос помечен python, поэтому он появляется и у людей, не разбирающихся в google-app-engine... Во всяком случае, я не думаю, что ОП совершил смертный грех. Я просто думаю, что чем яснее вопрос, тем лучше для всех пользователей. Ваше здоровье! :)   -  person mac    schedule 07.07.2011
comment
Извините, я как-то пропустил путаницу с заголовком - он скорее вводит в заблуждение.   -  person Nick Johnson    schedule 08.07.2011


Ответы (2)


Вы можете сделать это с помощью форматирования строки, например:

num = 5
tag = 'input_%d' % num

Таким образом, чтобы составить список значений всех тегов input_x, вы можете сделать что-то вроде этого:

input_values = []
for i in range(1, number_of_values + 1):
  input_values.append(self.request.get('input_%d' % i))

Это предполагает, что вы знаете, сколько значений нужно получить. Ваш вопрос предполагает, что вы это сделали, но в случае, если вы этого не сделали, вы можете перебирать результаты, пока не получите пустую строку (возвращаемое значение по умолчанию из request.get для несуществующей метки).

Изменить: приведенный выше комментарий предполагал, что вы используете webapp. Другие фреймворки могут выдать KeyError, если вы попытаетесь вызвать get для аргумента, который не существует и для которого не указано значение по умолчанию.

person Nick Johnson    schedule 07.07.2011
comment
OP заявил, что параметры помечены как input_1, input_2 и т. д. Вы перебираете диапазон (number_of_values). Не приведет ли это к ошибке «отклонение на одну»? - person Hyperboreus; 07.07.2011
comment
@Hyperboreus Ага, исправлено. Тем не менее, немного грубо голосовать за весь ответ из-за ошибки ограждения. - person Nick Johnson; 07.07.2011
comment
Спасибо, я действительно усложнил задачу в своей голове. Ваше решение, конечно, правильное - по какой-то причине я решил, что self.request.form.get() каким-то образом создает новую переменную в python, а не просто обращается к строковому параметру. Глупо, потому что я использовал эту функцию много-много раз! - person Cerzi; 09.07.2011

for x in total_inputs: list.append (locals () ['input_%d' % x] )

или если вам нужен словарь с именем переменной в качестве ключа и его значением в качестве значения:

vars = {}    
for x in total_inputs: vars ['input_%d' % x] = locals () ['input_%d' % x]

Вот какой рабочий пример в python2.6:

>>> input_0 = 'a'
>>> input_1 = 4
>>> input_2 = None
>>> for x in range (3): print locals () ['input_%d' % x]
...
a
4
None
>>>
person Hyperboreus    schedule 07.07.2011
comment
Извините, я только что понял, что название вопроса — доступ к неизвестным именам переменных в Python; теперь я понимаю источник путаницы. Я отредактировал заголовок на что-то более подходящее. - person Nick Johnson; 08.07.2011