我的'change password'函数不起作用,而是陷入循环



这是我的代码:

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"。

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

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

def change_password():
update_password()

。但这也没有用。

这是我要使用的逻辑:

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

请帮忙吗?蒂亚

顺便说一句,我很困惑PyCharm即将出现"未解决的引用'foo'"。该部分似乎工作正常,但是有关为什么会这样以及是否是问题的任何见解将不胜感激。

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

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

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

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

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

最重要的是,外部作用域 change_password(( 函数一遍又一遍地调用自己,因为它掩盖了内部作用域。尝试重命名两者之一。

最新更新