Моя функция «изменить пароль» не работает, и вместо этого я застреваю в al oop - PullRequest
1 голос
/ 16 февраля 2020

Вот мой код:

import pickle

current_user = None


class User:
    def __init__(self, username, password):
        self.username = username
        self.password = password

    def set_password(self):
        self.password = input("Enter NEW password > ")

    def __get_password(self):
        return self.password

    def __get_username(self):
        return self.username

    def change_password(self):
        my_password = input("Enter your CURRENT password > ")
        if my_password == self.__get_password():
            self.set_password()
        else:
            print("Please try again")

    def display_details(self):
        print()
        print("Username and password")
        print("---------------------")
        print("username is: ", User.__get_username(self))
        print("password is: ", User.__get_password(self))
        print()

    def __repr__(self):
        return f'username: {self.username}'


try:
    users = pickle.load(open("users.pickle", "rb"))
except (OSError, IOError) as f:
    users = [User("MichaelPalin", "P4rr0t"), User("EricIdle", "M0nty"), User("TerryJones", "Pyth0n")]
    pickle.dump(foo, open("users.pickle", "wb"))


def find_user(name):
    for user in users:
        if user.username == name:
            return user


def add_user():
    user = input("Enter NEW user > ")
    password = input(f"Enter password for {user} > ")
    users.append(User(user, password))


def delete_user():
    delete_user = input("Enter the user you wish to remove > ")
    user = find_user(delete_user)
    if user:
        users.remove(user)
        print('done')
    else:
        print(f'user {delete_user} not found')


def display_users():
    for user in users:
        print(user)


def invalid_entry():  # Response for invalid entries to menu.
    print("Invalid entry, please try again")
    print()


def menu():  # Display menu, prompt for and accept keyboard choice
    print("Please select one of the following:")
    print()
    print("Enter a if you want to add a new user")
    print("Enter d if you want to delete a user")
    print("Enter f if you want to find a user")
    print("Enter c if you want to change your password")
    print("Enter u if you want to display a list of users")
    print("Enter q if you want to Quit")
    choice = input("")
    return choice


while True:
    menu_choice = menu()
    if menu_choice.lower() == "a":
        add_user()
    elif menu_choice.lower() == "d":
        delete_user()
    elif menu_choice.lower() == "f":
        current_user = find_user()
    elif menu_choice.lower() == "c":
        if current_user is None:
            print("No user selected!")
            continue
        else:
            current_user.change_password()
    elif menu_choice.lower() == 'u':
        display_users()
    elif menu_choice.lower() == "q":
        print("Goodbye")
        with open('users.pickle', 'wb') as f:
            pickle.dump(users, f)
            quit()
    else:
        invalid_entry()

Там явно что-то не так, поскольку он застревает во всех oop:

Введите ваш ТЕКУЩИЙ пароль> пароль
Введите ваш ТЕКУЩИЙ пароль> пароль
Введите ваш ТЕКУЩИЙ пароль>

Я вижу, что PyCharm подходит 'локальная переменная my_password тоже не используется'.

Я пытался удалить my_password = input("Enter your CURRENT password > ") из блока def change_password(), но это приводит к фатальной ошибке.

Я также попытался переименовать первую функцию change_password в update_password и соответствующим образом обновить вторую, чтобы она вышла .. .

def change_password():
    update_password()

... но это тоже не сработало.

Это логика c, которую я хочу использовать:

  • IF пользователь выбирает 'c' в меню, ТО затем делает следующее ...
  • Предлагает пользователю ввести свой текущий пароль
  • ЕСЛИ введенный ввод совпадает с его текущим паролем, ТО предлагает им введите новый пароль и обновите его соответственно
  • ЕСЛИ введенный ввод не совпадает с их текущим паролем, ТО побудит их повторить попытку

Любая помощь, пожалуйста? TIA

Кстати, я озадачен тем, что PyCharm подходит к «неразрешенной ссылке« foo »». Этот раздел, кажется, работает нормально, но любая идея о том, почему это так, и если это проблема или нет, приветствуется.

Редактировать: я обновил код в соответствии с предложениями, насколько я могу в любом случае.

Редактировать 2: PyCharm сказал, что self в if my_password == self.__get_password(self) - неожиданный аргумент, поэтому я удалил его, и это, похоже, не принесло никакого вреда.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

Вы не застряли в oop, вы застряли в рекурсии

def change_password():
    my_password = input("Enter your CURRENT password > ")
    change_password()

обратите внимание, что вы просто продолжаете звонить, меняйте пароль снова и снова ... также у вас есть по каким-то причинам удвойте методы, используйте те, которые в вашем User классе.

, когда выбран 'c', у вас нет контекста, вы не знаете, ВОЗ пытается изменить их пароль, поэтому сначала вы должны спросите, кто пользователь, попробуйте следующие изменения: перед вашим while true l oop положите current_user = None измените запись для 'f' на current_user = find_user() и запись для 'c' на

if current_user is None:
    print("No user selected!")
    continue
else:
    current_user.change_password()
2 голосов
/ 16 февраля 2020

Другая функция change_password во внешней области также запрашивает ввод из командной строки. попытайтесь исключить все ненужные input("Enter your CURRENT password > "), кроме одного, и используйте вместо этого параметры в вызовах функций.

Кроме того, внешняя область видимости change_password () вызывает себя снова и снова, потому что она затеняет внутренний. Попробуйте переименовать один из двух.

...