Этот код работает, мой друг! Я думаю, что ваша проблема заключается в настойчивости. Если вы вызовете 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)