我的“更改密码”功能不起作用,而卡在循环中

问题描述 投票:0回答:2

这是我的代码:

import pickle


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 == User.__get_password(self):
            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 change_password():
    my_password = input("Enter your CURRENT password > ")
    change_password()


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":
        find_user()
    elif menu_choice.lower() == "c":
        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()

...但是那也不起作用。

这是我要使用的逻辑:

  • 如果用户在菜单中选择'c',则执行以下操作...
  • 提示用户输入当前密码
  • 如果输入的内容与他们当前的密码匹配,然后提示他们输入新密码并相应地更新其密码
  • 如果输入的输入与他们当前的密码不匹配,然后提示他们再试一次

有帮助吗? TIA

[顺便说一下,我很困惑PyCharm正在出现'未解决的引用'foo'。该部分似乎可以正常运行,但是如果您对这是为什么以及是否存在问题有任何见解,将不胜感激。

python function pickle
2个回答
0
投票
我认为是因为您的change_password函数正在调用ser_password函数,并且都希望从命令行输入。

也许做这样的事情:

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

以及外部作用域中的另一个change_password函数也请求命令行输入。尝试消除所有input("Enter your CURRENT password > ")除外,而是在函数调用中使用参数。

最重要的是,外部作用域change_password()函数不断地调用自身,因为它覆盖了内部作用域。尝试重命名两者之一。


0
投票
您没有陷入循环,您陷入了[[递归]

def change_password(): my_password = input("Enter your CURRENT password > ") change_password() 注意,您只是不断不断地调用更改密码...由于某种原因,您也有双重方法,请使用User类中的方法。

选择'c'时,您没有上下文,您不知道WHO试图更改其密码,因此首先必须询问用户是谁,然后尝试以下更改:在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()

© www.soinside.com 2019 - 2024. All rights reserved.