首页 > 解决方案 > 在密码管理器中使用 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

标签: pythonjson

解决方案


尝试用这个替换你的 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 的初始化,这就是它没有定义的原因......


推荐阅读