python - 我的“更改密码”功能不起作用,而是陷入循环
问题描述
这是我的代码:
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()
...但这也不起作用。
这是我要使用的逻辑:
- 如果用户在菜单中选择“c”,则执行以下操作...
- 提示用户输入他们当前的密码
- 如果输入的输入与他们当前的密码匹配,那么提示他们输入新密码并相应地更新他们的密码
- 如果输入的输入与他们当前的密码不匹配,那么提示他们再试一次
请问有什么帮助吗?TIA
顺便说一句,我很困惑 PyCharm 会出现“未解决的参考 'foo'”。该部分似乎工作正常,但任何有关其原因以及是否存在问题的见解都将不胜感激。
编辑:无论如何,我已经尽可能多地根据建议更新了代码。
编辑 2:PyCharm 说self
inif my_password == self.__get_password(self)
是一个意想不到的论点,所以我删除了它,这似乎没有造成任何伤害。
解决方案
你没有陷入循环,你陷入了递归
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()
推荐阅读
- azure - 使用 REST API 下载 Azure Devops Repository 的存档
- vba - IE 自动化 - VBA 错误 - 运行时错误 70:权限被拒绝
- wordpress - Wordpress 站点多次接收来自同一 IP 的请求
- java - 如何在 HashMap 中保留重复项
- angular - 如何解决我的分页错误指示“它在类型上不存在”?
- docker - curl 在脚本内运行时失败
- python - SQLAlchemy 表使用两个外键定义关系
- php - 如何使用日期函数修复 PHP 时区问题
- javascript - jQuery在提交时将输入值分配给隐藏字段
- reactjs - redux-saga api 调用响应过滤