Обновление значения в словаре внутри класса в Python - PullRequest
0 голосов
/ 20 июня 2020

Как мне обновить значение в словаре внутри класса?

Функция read_messages должна распечатать первые N сообщений в папке входящих сообщений пользователя, созданных в __init__, и изменить их прочитанные 'значение True, чтобы они не были напечатаны при следующем вызове функции.

Вот мой код:

class Outlook:
    def __init__(self, users):
        self.message_id = 0
        self.inboxes = {usr: [] for usr in users}

    def send_email(self, sender, recipient, title, body):
        user_inbox = self.inboxes[recipient]
        self.message_id = self.message_id + 1
        message_details = {
            'id': self.message_id,
            'title': title,
            'body': body,
            'sender': sender,
            'read': False
        }
        user_inbox.append(message_details)
        return self.message_id

    def read_messages(self, user, N):
        user_inbox = self.inboxes[user]
        for message in user_inbox[:N]:
            if message['read'] == False:
                print(message)
                message['read'] = True # this does not seem to work


ol1 = Outlook(['James Bond'])

ol1.send_email(
    sender='M',
    recipient='James Bond',
    title='Return to England!',
    body='James, return to England immediately',
)
ol1.send_email(
    sender='Miss Moneypenny',
    recipient='James Bond',
    title='Meeting with M',
    body='James, M wants to see you tomorrow at 11:00',
)

ol1.read_messages('James Bond',2)

EDIT: после первого вызова' ol1 .read_messages 'Я ожидаю, что никакие элементы не будут напечатаны при повторном вызове.

1 Ответ

0 голосов
/ 20 июня 2020

Этот код работает, мой друг! Я думаю, что ваша проблема заключается в настойчивости. Если вы вызовете ol1.read_messages('James Bond',2) последовательно (то есть напишите инструкцию дважды), вы увидите, что сообщения печатаются только один раз. Второй вызов не выводит никаких элементов. Однако при последовательном запуске программы python эти сообщения будут отображаться каждый раз, потому что каждый раз, когда программа запускается, сообщения создаются снова.

Я немного изменил ваш код, чтобы вы могли видеть это на практике. Здесь я могу печатать сообщения независимо от того, прочитаны ли они. Вы можете видеть, что во второй раз сообщения являются printrf, атрибут read был установлен на false. Это означает, что вы правильно обновляете словарь.

Однако вы будете видеть 2 сообщения, печатаемых при каждом запуске кода, потому что каждый раз, когда вы запускаете свою программу, вы начинаете с нуля. В конце программы память, в которой хранится ol1, возвращается в систему, и при повторном запуске программы ol1 воссоздается заново, и ей передаются новые сообщения.

class Outlook:
    def __init__(self, users):
        self.message_id = 0
        self.inboxes = {usr: [] for usr in users}

    def send_email(self, sender, recipient, title, body):
        user_inbox = self.inboxes[recipient]
        self.message_id = self.message_id + 1
        message_details = {
            'id': self.message_id,
            'title': title,
            'body': body,
            'sender': sender,
            'read': False
        }
        user_inbox.append(message_details)
        return self.message_id

    def read_messages(self, user, N):
        user_inbox = self.inboxes[user]
        for message in user_inbox[:N]:
            if message['read'] == False:
                print(message)
                message['read'] = True 
            else: # This will print read messages
                print(message)


ol1 = Outlook(['James Bond'])

ol1.send_email(
    sender='M',
    recipient='James Bond',
    title='Return to England!',
    body='James, return to England immediately',
)

ol1.send_email(
    sender='Miss Moneypenny',
    recipient='James Bond',
    title='Meeting with M',
    body='James, M wants to see you tomorrow at 11:00',
)

ol1.read_messages('James Bond', 2)

print('\nThis time the "read" attribute is true')
ol1.read_messages('James Bond', 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...