IndexError: список индексов вне диапазона (в результатах запроса) - PullRequest
1 голос
/ 21 ноября 2010

У меня проблемы с пониманием работы с результатами запроса. Я задал около полдюжины вопросов по этому поводу, но до сих пор не понимаю. Я копирую из предыдущего кода и заставляю его работать как-то, но так как я не понимаю основную концепцию, код ломается, если я делаю небольшое изменение. Я был бы очень признателен, если бы вы сказали мне, как вы представляете себе, что здесь происходит, и объясните мне это. Спасибо.

class ReceiveEmail(InboundMailHandler):
    def receive(self, message):
        logging.info("Received email from %s" % message.sender)
        plaintext = message.bodies(content_type='text/plain')
        for text in plaintext:
            txtmsg = ""
            txtmsg = text[1].decode()
            logging.info("Body is %s" % txtmsg)
            logging.info("CC email is %s" % ((message.cc).split(",")[1]))            

        query = User.all()           
        query.filter("userEmail =",  ((message.cc).split(",")[1])) 
        results = query.fetch(1)                   

        for result in results:                     
            result.userScore += 1                  

        um = results[0]                            
        um.userScore = result.userScore            
        um.put()

В этом коде, насколько я понимаю, запрос берет второй адрес электронной почты из списка cc и получает результат.

Затем я увеличиваю userScore на 1.

Далее я хочу обновить этот элемент в хранилище данных, поэтому я говорю

        um = results[0]                            
        um.userScore = result.userScore            
        um.put()

Но это дает ошибку индекса вне диапазона:

um = results[0]
IndexError: list index out of range

Почему? Я представляю, что results[0] является нулевым пунктом результатов. Почему это вне диапазона? Единственное, о чем я могу думать, это то, что список может быть None. Но я не понимаю почему. Он должен иметь 1 выбранный предмет.

Кроме того, если я попытаюсь проверить первый адрес электронной почты, изменив индекс с [1] на [0]

query.filter("userEmail =",  ((message.cc).split(",")[0]))

тогда я не получу IndexError.

Что я здесь не так делаю?

Спасибо!

EDIT

Смотрите комментарии:

(message.cc).split(",")[0]) 

оставил пробел перед электронными письмами (начиная со второго письма), поэтому запрос не соответствовал им;

>>> cc.split(",")
['cc12@example.com', ' cc13@example.com', ' cc13@example.com']

добавление пробела после запятой устранило проблему:

>>> listcc = cc.split(", ")
>>> listcc
['cc12@example.com', 'cc13@example.com', 'cc13@example.com']
>>> 

1 Ответ

1 голос
/ 21 ноября 2010

Чтобы понять код, разбейте его на части и посмотрите на него по частям:

class ReceiveEmail(InboundMailHandler):
    def receive(self, message):
        logging.info("Received email from %s" % message.sender)

        # Get a list of CC addresses.  This is basically a for loop.
        cc_addresses = [address.strip() for address in message.cc.split(",")]
        # The CC list goes with the message, not the bodies.
        logging.info("CC email is %s" % (cc_addresses))

        # Get and iterate over all of the *plain-text* bodies in the email.
        plaintext = message.bodies(content_type='text/plain')
        for text in plaintext:
            txtmsg = ""
            txtmsg = text[1].decode()
            logging.info("Body is %s" % txtmsg)

        # Setup a query object.
        query = User.all()
        # Filter the user objects to get only the emails in the CC list.
        query.filter("userEmail IN",  cc_addresses)
        # But, only get at most 10 users.
        users = query.fetch(10)

        logging.info('Got %d user entities from the datastore.' % len(users))

        # Iterate over each of the users increasing their score by one.
        for user in users:
            user.userScore += 1

        # Now, write the users back to the datastore.
        db.put(users)
        logging.info('Wrote %d user entities.' % len(users))

Я бы внес корректировку в структуру вашей модели. Когда вы создаете сущность User, я бы присвоил key_name адрес электронной почты. Вы сможете сделать ваши запросы намного эффективнее.

Некоторые ссылки:

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