проблема с кодом Python - PullRequest
       4

проблема с кодом Python

2 голосов
/ 11 августа 2010

У меня есть этот код:

class Check(webapp.RequestHandler):
  def get(self):
    user = users.get_current_user()

    be = "SELECT * FROM Benutzer ORDER BY date "
    c = db.GqlQuery(be)

    for x in c:
      if x.benutzer == user:
        s=1
        break
      else:
        s=2
    if s is 0:
      self.redirect('/')

, чтобы проверить, зарегистрирован пользователь или нет.но это дает мне ошибку:

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 511, in __call__
    handler.get(*groups)
  File "/Users/zainab_alhaidary/Desktop/الحمد لله/check.py", line 23, in get
    if s is 0:
UnboundLocalError: local variable 's' referenced before assignment

что мне делать ???

Ответы [ 7 ]

6 голосов
/ 11 августа 2010

Определите s, прежде чем присваивать ему значение (также измените тест на s):

user = users.get_current_user()

be = "SELECT * FROM Benutzer ORDER BY date "

c = db.GqlQuery(be)

s=0    # <- init s here

for x in c:
  if x.benutzer == user:
    s=1
    break
  else:
    s=2
if s == 0:    # <- change test on s
  self.redirect('/')
4 голосов
/ 11 августа 2010

Почему именно вы загружаете всех пользователей, затем просматриваете их, чтобы найти одного? Используйте предложение where:

be = "SELECT * FROM Benutzer WHERE benutzer=:1"
c = db.GqlQuery(be, user)
user_from_db = c.get()
if user_from_db is not None: # found someone
    dostuff()
else:
    self.redirect('/')
2 голосов
/ 11 августа 2010

Вы используете 's', прежде чем назначить что-то для него. Добавьте 's = 0' в соответствующем месте.

2 голосов
/ 11 августа 2010

Вы хотите установить s в 0 до начала цикла for.Если запрос возвращает ноль элементов, ваш цикл for не зацикливается ни разу, поэтому s не определено.

Также вы должны использовать if s == 0: вместо if s is 0:.В CPython они оба эквивалентны, но вы не должны полагаться на этот факт.Смотрите: документация для PyInt_FromLong и "is" оператор неожиданно ведет себя с целыми числами .

1 голос
/ 11 августа 2010

Ваша проблема в том, что если c - пустой список, то код в цикле for никогда не запускается и s никогда не устанавливается, поэтому возникает ошибка:

UnboundLocalError: local variable 's' referenced before assignment

Что заошибка говорит вам, что вы ссылаетесь - то есть используете - s до того, как оно будет иметь какое-либо значение - то есть до того, как ему будет присвоено значение.

Чтобы это исправить, просто убедитесь, что s всегда назначаетсязначение:

s = 0

for x in c:
    if x.benutzer == user:
        s = 1
        break
    else:
        s = 2
0 голосов
/ 11 августа 2010

Я не знаю, почему вы это делаете, но если я правильно понимаю ваш код, у вас будет s=1, когда x.benutzer == user, и s=2 в противном случае (разве это не должно быть s=0, если вы собираетесьсравнить с 0?).

for x in c:
   if x.benutzer == user:
      s=1
      break
   else:
      s=2
if s is 0:
   self.redirect('/')

В любом случае, вот мое решение:

if not any(x.benutzer == user for x in c):
   self.redirect('/')
0 голосов
/ 11 августа 2010

В случае, если c пусто, оператор if в цикле никогда не выполняется

Вы должны установить s=0 перед циклом for

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