python - 在密码管理器中使用 if 语句会给我一个 Python 中的 NameError
问题描述
我正在构建一个小型密码管理器,它使用 random 和 string 模块生成随机 15 个字符长的密码,并使用 json 模块将程序中的字典以 json 格式存储到另一个文件中。该程序还使用“主”密码保护,该密码也存储在“data.json”文件中。输入错误的密码时,程序会用新的“主”密码覆盖旧的“data.json”文件。
代码:
import string
import json
import random
def generate_password():
chars = string.ascii_lowercase + string.ascii_uppercase
return ''.join(random.choice(chars) for i in range(15))
def get_password():
with open('data.json', 'r') as file:
data = json.load(file)
return data.get('main')
print('Password manager by raphtlw\nversion 1.0') # version info
mainPassword = input('What is your password?\n')
try:
with open('data.json', 'r') as file:
data = json.load(file)
password_data = data.get('main')
except IOError:
pass
if mainPassword == password_data: <--- <NameError>
None
else:
with open('data.json', 'w') as file:
json.dump('{"main":%s}' % (mainPassword), file)
print('Existing register overwritten! What would you like to do?')
# Main program
while True:
print("""
Commands:
-----------
1. Generate a new password
2. Get password
3. Quit program
""")
command = input('Please enter the command\n')
if command == 1:
label = input('Please enter a label for the password\n')
password = generate_password()
with open('data.json', 'a') as file:
json.dump('{%s:%s}' % (label, password), file)
elif command == 2:
get_label = input('Please enter the label of the password you want to access\n')
with open('data.json', 'r') as file:
data = json.load(file)
password = data.get(get_label)
print(password)
elif command == 3:
quit('Program exited')
错误:
Traceback (most recent call last):
File "c:\Users\raphp\Desktop\Python Projects\Password Manager\main.py", line 25, in <module>
if mainPassword == password_data:
NameError: name 'password_data' is not defined
解决方案
尝试用这个替换你的 try 块:
password_data = None
try:
with open('data.json', 'r') as file:
data = json.load(file)
password_data = data.get('main')
except IOError:
pass
if password_data is None:
# you had an IO error, handle it appropriately
pass
if main_password==password_data:
然后继续使用您自己的代码
可能发生的情况是您有一个 IOError,这意味着它永远不会影响您对 password_data 的初始化,这就是它没有定义的原因......
推荐阅读
- go - 如何正确测试错误对象?
- cython - 如何在cython中提供cpp类析构函数成员信息
- python - 用python重构JSON数据
- jquery - jQuery在点击时获取每个复选框的值
- reactjs - 如果我的产品前端是基于 React 的,我可以只雇佣一个前端团队吗?还是我应该为网络雇用两个人,为移动应用程序雇用另一个人?
- java - 如何优化最小值和最大值以找到最高分总和
- javascript - 在 Chrome 扩展全局对象中注入脚本并篡改影子 DOM
- azure - 什么是构建 Azure 逻辑应用中的集成帐户和集成服务环境?
- c# - 在 Linq 中按条件分组
- directory - 返回 Julia 中当前目录上方的一个文件夹