首页 > 解决方案 > 我的“更改密码”功能不起作用,而是陷入循环

问题描述

这是我的代码:

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()

显然有问题,因为它陷入了循环:

输入您的当前密码 > 密码
输入您的当前密码 > 密码
输入您的当前密码 >

我可以看到 PyCharm 也出现了“未使用局部变量 my_password”。

我尝试my_password = input("Enter your CURRENT password > ")def change_password()块中删除,但这只会导致致命错误。

我还尝试将第一个change_password函数重命名为update_password并相应地更新第二个函数,以便它运行...

def change_password():
    update_password()

...但这也不起作用。

这是我要使用的逻辑:

请问有什么帮助吗?TIA

顺便说一句,我很困惑 PyCharm 会出现“未解决的参考 'foo'”。该部分似乎工作正常,但任何有关其原因以及是否存在问题的见解都将不胜感激。

编辑:无论如何,我已经尽可能多地根据建议更新了代码。

编辑 2:PyCharm 说selfinif my_password == self.__get_password(self)是一个意想不到的论点,所以我删除了它,这似乎没有造成任何伤害。

标签: pythonfunctionpickle

解决方案


你没有陷入循环,你陷入了递归

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

请注意,您只是一遍又一遍地调用更改密码......而且由于某种原因您有双重方法,请使用您User班级中的方法。

选择时'c'您没有上下文,您不知道谁正在尝试更改他们的密码,所以首先您必须询问用户是谁,尝试以下更改:在while true循环之前current_user = None 将条目更改为'f'current_user = find_user() 和条目'c'成为

if current_user is None:
    print("No user selected!")
    continue
else:
    current_user.change_password()

推荐阅读