Использование постоянно меняющейся переменной для определения списка

#python

#python

Вопрос:

Я хочу создать фрагмент кода, который извлекает заголовок и ссылку из RSS-канала и компилирует его в переменную, которую затем можно использовать в теле сообщения. Моя проблема в том, что Body переопределяется каждый раз, когда я извлекаю информацию из RSS. Я очень новичок в программировании и Python, и у меня сложилось впечатление, что использование списка было бы лучшим решением.

 for i in range(3):

    MessageTitle = feed['items'][i].title
    MessageLink = " - ",feed['items'][i]['link']

    Body = "%s%s%s%s" % (MessageTitle,"n","n", MessageLink) #in unicode

    gmail_user = "user@gmail.com"
    gmail_pwd = "pw"

    mail("user@gmail.com",
         "Reddit Update",
         Body)
  

Я собирался вставить список ниже body и использовать body для его определения .. что-то вроде:

 list[i] = [Body]
  

Я на правильном пути?

Комментарии:

1. Возможно, вы захотите рассмотреть возможность изменения "%s%s%s%s" % (MessageTitle,"n","n", MessageLink) на "%snn%s" % (MessageTitle, MessageLink) .

Ответ №1:

Существует множество шаблонов проектирования, которые вы можете рассмотреть для использования. Я продемонстрирую несколько, где вам не нужно использовать [i] даже:

Накопитель:

 messages = []
for feedItem in feed['items']:
    message = {'title':..., ...}
    message['link'] = ...  # alternative
    messages  = [message]   # or messages.append(data)

print(messages)
  

Сопоставление (часто наиболее элегантное решение в простых случаях, подобных этому):

 def makeMessage(feedItem):
    message = {'title':..., ...}
    return message

messages = [makeMessage(fi) for fi in feed['items']]
print(messages)
  

Генераторы:

 def makeMessages(feedItems):
    for item in feedItems:
        message = {'title':..., ...}
        yield message

messages = list( makeMessages(feed['items']) )
  

несвязанное дополнение:
Вы могли бы даже подумать о создании класса для ваших сообщений:

 class Message(object):
    def __init__(self, title, link, body):
        self.title = title
        self.link = link
        self.body = body

    def __str__(self):
        return ...
    def __repr__(self):
        return self.__str__()