Помогите, пожалуйста, исправить код (Классы, 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
→ Ссылка