Помогите, пожалуйста, исправить код (Классы, itertools, дата и время)
Помогите, пожалуйста, исправить код. Нужно вывести список с кортежами имя/дата, дата в которых меньше текущей на год (то есть, прошел уже год после даты относительно текущей даты), используя класс и инструмент из модуля itertools.
from itertools import chain
import datetime
from datetime import timedelta
class User:
username = str
register_date = datetime
def __init__(self, username, register_date):
self.username = username
self.register_date = register_date
def sort(self):
if datetime.datetime.now() - timedelta(days=365) > self.register_date:
return User(f'username={self.username}, register_date={self.register_date}')
user_reg = [User(username='Chess', register_date=datetime.datetime(2021, 9, 5, 4, 10, 43, 712296)),
User(username='Robert', register_date=datetime.datetime(2021, 9, 4, 4, 10, 43, 712304)),
User(username='Monica', register_date=datetime.datetime(2021, 9, 3, 4, 10, 43, 712286)),
User(username='Sara', register_date=datetime.datetime(2021, 9, 3, 4, 10, 43, 712233)),
User(username='Alice', register_date=datetime.datetime(2021, 8, 30, 4, 10, 43, 712313)),
User(username='Mila', register_date=datetime.datetime(2021, 8, 28, 4, 10, 43, 712324)),
User(username='John', register_date=datetime.datetime(2021, 8, 27, 4, 10, 43, 712273))]
for i in user_reg:
print(i.sort())
>>>TypeError: __init__() missing 1 required positional argument: 'register_date'
В общем, итоговый код должен выполнять те же действия, что и тот, что ниже, только с применением класса и инструмента из модуля из itertools. Также интересно: можно ли реализовать код выше только с помощью метода str? Я пробовал поставить в него if, но он выдавал ошибку "str returned non-string (type NoneType)". Еще прошу указать на мои ошибки в использовании класса и показать, как правильно делать. Спасибо!
user_reg2 = [('Chess', datetime.datetime(2021, 9, 5, 4, 10, 43, 712296)),
('Robert', datetime.datetime(2021, 9, 4, 4, 10, 43, 712304)),
('Monica', datetime.datetime(2021, 9, 3, 4, 10, 43, 712286)),
('Sara', datetime.datetime(2021, 9, 3, 4, 10, 43, 712233)),
('Alice', datetime.datetime(2021, 8, 30, 4, 10, 43, 712313)),
('Mila', datetime.datetime(2021, 8, 28, 4, 10, 43, 712324)),
('John', datetime.datetime(2021, 8, 27, 4, 10, 43, 712273))]
result = []
for i in user_reg2:
if datetime.datetime.now() - datetime.timedelta(days=365) > i[1]:
result.append(i)
print(result)
>>>[('Robert', datetime.datetime(2021, 9, 4, 4, 10, 43, 712304)),
('Monica', datetime.datetime(2021, 9, 3, 4, 10, 43, 712286)),
('Sara', datetime.datetime(2021, 9, 3, 4, 10, 43, 712233)),
('Alice', datetime.datetime(2021, 8, 30, 4, 10, 43, 712313)),
('Mila', datetime.datetime(2021, 8, 28, 4, 10, 43, 712324)),
('John', datetime.datetime(2021, 8, 27, 4, 10, 43, 712273))]
Ответы (1 шт):
Автор решения: MiniMax
→ Ссылка
import datetime
import itertools
class User:
def __init__(self, username, register_date):
self.username = username
self.register_date = register_date
def __str__(self):
return f"{self.username} {self.register_date}"
user_reg = [
User(username='Chess', register_date=datetime.datetime(2021, 9, 5, 4, 10, 43, 712296)),
User(username='Robert', register_date=datetime.datetime(2021, 9, 4, 4, 10, 43, 712304)),
User(username='Monica', register_date=datetime.datetime(2021, 9, 3, 4, 10, 43, 712286)),
User(username='Sara', register_date=datetime.datetime(2021, 9, 3, 4, 10, 43, 712233)),
User(username='Alice', register_date=datetime.datetime(2021, 8, 30, 4, 10, 43, 712313)),
User(username='Mila', register_date=datetime.datetime(2021, 8, 28, 4, 10, 43, 712324)),
User(username='John', register_date=datetime.datetime(2021, 8, 27, 4, 10, 43, 712273))
]
delta_year = datetime.timedelta(days=365)
cmp_delta = lambda user: (datetime.datetime.now() - user.register_date) <= delta_year
result = itertools.filterfalse(cmp_delta, user_reg)
print(*result, sep="\n")
Output
Robert 2021-09-04 04:10:43.712304
Monica 2021-09-03 04:10:43.712286
Sara 2021-09-03 04:10:43.712233
Alice 2021-08-30 04:10:43.712313
Mila 2021-08-28 04:10:43.712324
John 2021-08-27 04:10:43.712273