Почему dict не меняется в python?

#python-3.x

#python-3.x

Вопрос:

У меня есть этот простой код:

 import random
from db import db

print('Simplest Database! H for help')

def p():
    key     = input('Enter key: ')
    value   = input('Enter value: ')
    db[key] = value
    print(f'Pair {key}-{value} putted to DB!')
    cli()

def g():
    key = input('Enter key: ')
    print(f'Key {key} is {db[key]}')
    cli()

def l():
    print('All database:')
    for k, v in db.items():
        print(f'{k} - {v}')

def r():
    print('Random value: ')
    print(random.choice(list(db.values())))
    cli()

def h():
    print('P to put data')
    print('G to get data')
    print('L to list all DB')
    print('R to random value')
    print('H to show this message')
    print('Q to quit')
    cli()

def cli():
    cmd = input('> ')
    if cmd == 'P':
        p()
    if cmd == 'G':
        g()
    if cmd == 'L':
        l()
    if cmd == 'R':
        r()
    if cmd == 'H':
        h()
    if cmd == 'Q':
        print('Exiting, bye')
        exit()
    else:
        print('Unexpected command!')
        cli()

cli()
  

И файл БД:

 db = {}
  

У меня есть две проблемы:
Когда я набираю L, cmd печатает базу данных, да, но затем печатает неожиданную команду!
И основная проблема:
Когда я меняю DB, все печатается, но файл не изменяется, и после перезапуска file db пуст!
Я совершенно не знаю, почему

Ответ №1:

Поскольку вы хотите, чтобы «Неожиданная команда!» печаталась только в том случае, если cmd doens не соответствует ни одному из параметров, вы должны изменить все свои if операторы elif , кроме первого.

И вы хотите cli быть меню, которое продолжает выполняться, вам следует подумать о том, чтобы изменить его на цикл. Таким образом, вам не нужно вызывать cli() в конце всех ваших других функций.

И если вы хотите сохранить внесенные изменения db , чтобы он отслеживал изменения между выполнением кода, я предлагаю сохранить его в текстовый файл.

Поскольку вы используете словарь, вы можете рассмотреть json пакет. Вместо того, чтобы загружать ваш db файл из файла python, вы можете записать две небольшие функции, одну для загрузки и одну для сохранения db . Таким образом, вы убедитесь, что ваши данные будут сохранены после выхода из вашего меню.

Весь ваш новый код должен быть примерно таким

 import random
import json

db = {}
my_db_file = 'db.json'

def load_data():
    global db
    try:
        with open(my_db_file, 'r') as file:
            db = json.load(file)
    except FileNotFoundError:
        pass

def save_data():
    with open(my_db_file, 'w') as file:
        json.dump(db, file)

def p():
    key     = input('Enter key: ')
    value   = input('Enter value: ')
    db[key] = value
    print(f'Pair {key}-{value} putted to DB!')

def g():
    key = input('Enter key: ')
    print(f'Key {key} is {db[key]}')

def l():
    print('All database:')
    for k, v in db.items():
        print(f'{k} - {v}')

def r():
    print('Random value: ')
    print(random.choice(list(db.values())))

def h():
    print('P to put data')
    print('G to get data')
    print('L to list all DB')
    print('R to random value')
    print('H to show this message')
    print('Q to quit')

def cli():
    cmd = input('> ')
    while cmd != 'Q':
        if cmd == 'P':
            p()
        elif cmd == 'G':
            g()
        elif cmd == 'L':
            l()
        elif cmd == 'R':
            r()
        elif cmd == 'H':
            h()
        else:
            print('Unexpected command!')
        cmd = input('> ')
    else:
        print('Exiting, bye')
        save_data()
        exit()


print('Simplest Database! H for help')
load_data()
cli()
  

Это почти то же самое, я только что внес исправления cli , удалил его вызов из других функций, поскольку в нем больше нет необходимости, и добавил две новые функции для сохранения и загрузки ваших данных.

После первого запуска этого кода вы заметите новый файл, вызываемый db.json в том же каталоге вашего скрипта python. Это ваша база данных, вы можете заглянуть в нее, если хотите проверить, сохранены ли данные так, как вы хотели.

Вот и все. Дайте нам знать, если у вас возникнут дополнительные вопросы!