Google Wave Robot/Python Переменный вопрос

Я экспериментирую/развлекаюсь с волновым роботом python apiv2.

Я сделал небольшое приложение 8ball для робота, которое отлично работает, и теперь я пытаюсь сделать приложение для викторин.

Я никогда не программировал на Python, но я уверен, что мой синтаксис правильный. Вот соответствующий код:

elif (bliptxt == "\n!strivia"):
  reply = blip.reply()
  if (triviaStatus != "playing"):
   reply.append("Trivia Started!")
   triviaStatus = "playing"
  else:
   reply.append("Trivia is already running!")
elif (bliptxt == "\n!etrivia"):
  reply = blip.reply()
  if (triviaStatus == "playing"):
   reply.append("Trivia Ended!")
   triviaStatus = "stopped"
  else:
   reply.append("Trivia is not running! To start trivia, type !strivia")
else: (snipped out)

Итак, в основном я хочу, чтобы это работало так, чтобы, когда кто-то мигает «strivia», бот распознавал, что кто-то хочет играть, поэтому сначала проверял переменную с именем triviaStatus, чтобы увидеть, играем ли мы уже, и исходил оттуда. Довольно простые вещи.

Чтобы это работало (и, на самом деле, этот код действительно предназначен для проверки этого вопроса), переменные должны быть похожи на переменные php $_SESSION, то есть он запоминает значение переменной каждый раз, когда кто-то мигает и не перезагружается каждый раз.

Тем не менее, так это или нет (если это не так, то я предполагаю, что могу сделать то же самое, сохранив настройки переменных в текстовом файле или что-то в этом роде), я сбит с толку, потому что приведенный выше код вообще не работает. То есть робот не отвечает ни на !strivia, ни на !etrivia. Если переменные не были сохранены, то робот должен просто ответить "Викторина запущена" или "Викторина не запущена!" каждый раз. Но он просто не отвечает вообще.

Если я уберу проверку на triviaStatus, робот ДЕЙСТВИТЕЛЬНО ответит. Но тогда нет никакой логики, и я не могу проверить свой вопрос.

Я также пытался создать !trivstatus, где он отвечал бы

"Trivia status is " + triviaStatus

но это ТАКЖЕ захлебнулось. Почему каждый раз, когда я хочу ИСПОЛЬЗОВАТЬ triviaStatus, бот просто умирает? Обратите внимание, что я могу установить triviaStatus в порядке (я просто не могу проверить, что выводится, отвечая на него....)

Итак, подводя итог... почему приведенный выше код не работает, но следующий код работает:

elif (bliptxt == "\n!strivia"):
  reply = blip.reply()
  reply.append("Trivia Started!")
  trivia_status = "playing"
elif (bliptxt == "\n!etrivia"):
  reply = blip.reply()
  reply.append("Trivia Ended!")
  trivia_status = "stopped"

Спасибо!


person Greg    schedule 18.05.2010    source источник
comment
Ах, извините... Я не знаю, почему код выглядит так странно. В превью это выглядело прекрасно! Вот скриншоты кода, которые должны облегчить чтение. Код, который не работает (первый опубликованный мной): img341.imageshack.us/img341/ 575/doesnotworkpython.png Код, который работает (третий опубликованный мной): img202 .imageshack.us/img202/5096/workspython.png Спасибо!   -  person Greg    schedule 19.05.2010
comment
с/тривиастатус/тривиа_статус/   -  person jfs    schedule 19.05.2010
comment
@Greg: сделайте отступ в коде, используя 4 пробела (или выберите код и нажмите соответствующую кнопку в редакторе)   -  person jfs    schedule 19.05.2010
comment
() не нужны для if/elif/ выражений.   -  person jfs    schedule 19.05.2010
comment
Я бы создал словарь с такими функциями, как dict(strivia=self.cmd_strivia, etrivia=self.cmd_etrivia)(), и поместил бы его в self.message_received или что-то в этом роде.   -  person jfs    schedule 19.05.2010
comment
Вау, впечатляет, как быстро вы тут комментируете, ха-ха! Да, имя переменной изменилось между двумя выражениями, я просто смотрел, не испортит ли по какой-то причине подчеркивание (это не... не имело значения). Итак, () не нужны, но действительно ли они нарушают код? Я предполагаю, что не потому, что некоторые другие коды роботов используют if(), и эти части работают нормально. Я не совсем понял ваш последний комментарий, к сожалению. Что бы это сделало? Что такое self.message_received/что он делает?   -  person Greg    schedule 19.05.2010
comment
Нет, () код не взламывать. В прошлом комментарии я предложил создать класс Bot с методами cmd_strivia, cmd_etrivia, message_received. message_received() выполняет работу операторов if/elif/else, но делегирует фактические ответы cmd_* методам.   -  person jfs    schedule 19.05.2010
comment
@Greg: Если вы не знаете, что такое класс, просто забудьте об этом. Это не относится к вопросу.   -  person jfs    schedule 19.05.2010


Ответы (1)


Кажется, вам следует переименовать triviaStatus в trivia_status и убедиться, что trivia_status имеет какое-то значение, например, привязать его к None перед первым использованием. В противном случае ваш код может вызвать исключения UnboundLocalError или NameError из-за того, что triviaStatus/trivia_status не ссылается ни на один объект.

person jfs    schedule 18.05.2010
comment
Это сработало! К сожалению, однако, как я и ожидал, переменная просто сбрасывается каждый раз, когда кто-то отправляет новый сигнал, поэтому мне, вероятно, придется хранить значения в текстовом файле. (Нет другого способа сделать это, верно?) - person Greg; 19.05.2010
comment
@Greg: Трудно сказать без контекста. Какой код вы используете в качестве основы, например, wave.to/guides/simple-robots- v2/blippy code.google.com /apis/wave/extensions/robots/ Вы можете использовать глобальные переменные (обработчик событий — это функция) или атрибуты экземпляра (обработчик событий — это объект) - person jfs; 19.05.2010
comment
@Greg: если каждый сигнал обрабатывается в другом процессе (модель cgi), вам нужно использовать какое-то постоянное хранилище данных / базу данных, например. google.appengine.ext.db в App Engine. Можете ли вы писать плоские текстовые файлы, зависит от того, где развернут ваш сценарий. - person jfs; 19.05.2010