Не получается взять логин из множества и сравнить с введенным в виджете значением

Имеются сохраненные объекты User в множестве database_set. У юзера есть поля (firstname, lastname, patronymic, login, password) нужно достать из множества User, а из него поле login, чтобы потом я мог сохраненные логины сравнить с введённым в виджете.

Код юзера

class User():
    def __init__(self, firstname, lastname, patronymic, login, password):
        self.firstname = firstname
        self.lastname = lastname
        self.patronymic = patronymic
        self.login = login
        self.password = password

    def __str__(self):
        return f"User(firstname={self.firstname}, lastname={self.lastname}, patronymic={self.patronymic}, " \
               f"login={self.login}, password={self.password})"


from entity.user import User

database_set = set()
test_user_one = User("Arkadi", "Vartanyan", "Gevorkovich", "adik508", "ad123")
test_user_two = User("Ivan", "Ivanov", "Ivanovich", "ivan508", "ivan123")
test_user_three = User("Artem", "Artemov", "Artemovich", "artem508", "artem123")
test_user_four = User("Vasili", "Vasilev", "Vasilevich", "vasili508", "vasili123")


def save_database(user):
    database_set.add(user)
    print("Пользователь успешно сохранен!")


save_database(test_user_one)
save_database(test_user_two)
save_database(test_user_three)
save_database(test_user_four)

Ответы (2 шт):

Автор решения: mymedia

Множества в Python (тип set) удобно использовать только с простыми типами, такими как строки или числа. Сохраняйте в ваше множество только логины пользователей, а не их объекты. Так будет проще выполнить проверку оператором in.

def save_database(user):
    database_set.add(user.login)
    print("Пользователь успешно сохранен!")
if LoginWidget.get() in database_set:
    ...
→ Ссылка
Автор решения: insolor

Тут имеет смысл использовать словарь, а не множество. В этом словаре ключи - логины, значения - сами объекты пользователей. Тогда легко через in проверить наличие логина в базе, потом по логину получить самого юзера, и потом, например, проверить пароль.

Если использовать set для хранения пользователей, то через in можно проверить разве что наличие логина (если переопределить методы __hash__ и __eq__ класса User), а сам объект придется искать перебором элементов множества.

class User():
    def __init__(self, firstname, lastname, patronymic, login, password):
        self.firstname = firstname
        self.lastname = lastname
        self.patronymic = patronymic
        self.login = login
        self.password = password

    def __repr__(self):
        return f"User(firstname={self.firstname}, lastname={self.lastname}, patronymic={self.patronymic}, " \
               f"login={self.login}, password={self.password})"

# ---

# from entity.user import User

database = dict()
test_user_one = User("Arkadi", "Vartanyan", "Gevorkovich", "adik508", "ad123")
test_user_two = User("Ivan", "Ivanov", "Ivanovich", "ivan508", "ivan123")
test_user_three = User("Artem", "Artemov", "Artemovich", "artem508", "artem123")
test_user_four = User("Vasili", "Vasilev", "Vasilevich", "vasili508", "vasili123")


def add_user(user):
    database[user.login] = user
    print(f"Пользователь {user.login} успешно добавлен!")


add_user(test_user_one)
add_user(test_user_two)
add_user(test_user_three)
add_user(test_user_four)


def check_user(login, password):
    return login in database and database[login].password == password


# ---

import tkinter as tk
from tkinter import messagebox


root = tk.Tk()

entry_login = tk.Entry(root)
entry_login.pack()
entry_password = tk.Entry(root, show="*")
entry_password.pack()


def login():
    if check_user(entry_login.get(), entry_password.get()):
        messagebox.showinfo("Ok", "Success!")
    else:
        messagebox.showerror("Error", "Wrong login or password!")


tk.Button(root, text="Login", command=login).pack()

root.mainloop()
→ Ссылка