Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/120: Рейтинг темы: голосов - 120, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 5

Задание по программированию: Key-value хранилище

23.09.2020, 22:15. Показов 24914. Ответов 4

Студворк — интернет-сервис помощи студентам
На этой неделе мы с вами реализуем собственное key-values хранилище. Данные будут сохраняться в файле storage.data. Добавление новых данных в хранилище и получение текущих значений осуществляется с помощью утилиты командной строки storage.py. Пример работы утилиты:

Сохранение значения value по ключу key_name:

Code
1
$ storage.py --key key_name --val value
Получение значения по ключу key_name:
Code
1
$ storage.py --key key_name
Вашей задачей будет написать реализацию утилиты storage.py.

Утилита может вызваться со следующими параметрами:

--key <имя ключа> , где <имя ключа> - ключ по которому сохраняются/получаются значения

--val <значение>, где <значение> - сохраняемое значение.

Если при запуске утилиты переданы оба ключа, происходит добавление переданного значения по ключу и сохранение данных в файле. Если передано только имя ключа, происходит чтение файла хранилища и вывод на печать значений, которые были сохранены по данному ключу. Обратите внимание, что значения по одному ключу не перезаписываются, а добавляются к уже сохраненным. Другими словами - по одному ключу могут храниться несколько значений. При выводе на печать, значения выводятся в порядке их добавления в хранилище. Формат вывода на печать для нескольких значений:

Code
1
value_1, value_2
Обратите внимание на пробел после запятой. Если значений по ключу не было найдено, выведите пустую строку или None.

Для работы с аргументами командной строки используйте модуль argparse. Хранить данные в файле мы рекомендуем в формате JSON с помощью использования модуля стандартной библиотеки json. Прежде чем отправлять ваше решение на проверку, протестируйте работу вашей утилиты на добавление нескольких ключей и разных значений.

Файл следует создавать с помощью модуля tempfile.

Пример работы:

Code
1
2
3
4
5
6
7
8
$ python storage.py --key key_name --val value
$ python storage.py --key key_name
value
 
$ python storage.py --key multi_key --val value1
$ python storage.py --key multi_key --val value2
$ python storage.py --key multi_key
value1, value2
Вот мой код

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import argparse, os, json, tempfile
 
 
def wd(my_dict, key, val):
    if key in my_dict:
        try:
            my_dict[key].append(val)
        except AttributeError:
            my_dict[key] = [my_dict[key], val]
    else:
        my_dict[key] = val
 
 
parser = argparse.ArgumentParser()
parser.add_argument("-key", "--key", help=' random text')
parser.add_argument("-val", "--val", required=False, help='random_text')
args = parser.parse_args()
 
storage_path = os.path.join(tempfile.gettempdir(), 'storage.data')
 
if os.path.isfile('/tmp/storage.data'):
    if args.val:
        with open('/tmp/storage.data', 'r') as f:
            m = json.load(f)
            wd(m, args.key, args.val)
        with open('/tmp/storage.data', 'w') as f:
            json.dump(m, f)
 
    else:
        try:
            with open('/tmp/storage.data', 'r') as f:
                m = json.load(f)
                if m[args.key] is not list:
                    print(', '.join(m[args.key]))
                else:
                    print(m[args.key])
        except:
            print(None)
else:
    dicti = {}
    with open('/tmp/storage.data', 'w') as f:
        json.dump(dicti, f)
    if args.val is None:
        print(None)
    else:
        with open('/tmp/storage.data', 'r') as f:
            m = json.load(f)
            wd(m, args.key, args.val)
        with open('/tmp/storage.data', 'w') as f:
            json.dump(m, f)
Но он не проходит. Падает с такой ошибкой:
В хранилище сохранены значения двух ключей (key_1=number_1, value_1=abc и key_2=number_2,value_2=abc). Запрос на получение значения по ключу: number_1 вывел на печать не верное значение : a, b, c.
assert 'a, b, c' == 'abc'
Помогите, пожалуйста, разобраться. Заранее большое спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.09.2020, 22:15
Ответы с готовыми решениями:

Задание по программированию: Key-value хранилище
Добрый вечер. Изучаю питон по курсам на курсере. Там есть одна задачка: Вашей задачей будет написать скрипт, который...

Key value хранилище
Здравствуйте, необходима помощь с задачей. Суть такая: нужно записывать в файл пару ключ-значение, путем передачи аргументов в ком....

задание по программированию
дан треугольник путем задания его вершин также дано 20 точек.Определить какие точки лежат внутри,на границе или же вне данного...

4
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
24.09.2020, 06:04
Ужасный код. Что качается ошибки, то
Цитата Сообщение от MVanza Посмотреть сообщение
if m[args.key] is not list:
print(', '.join(m[args.key]))
Вы строку 'abc' выводите посимвольно.
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
24.09.2020, 09:57
Код, конечно, не ахти, но, по крайней мере, человек сам делал
Поможем причесать.
1. Посмотрите, сколько раз у вас там повторяется '/tmp/storage.data'. А open('/tmp/storage.data', 'r') as f ? Может, вынести в одну переменную? А если ещё поискать повторяющиеся фрагменты?
2. Подуймайте, а что если у вас там будет несколько сторажей, смотрящих на разные файлы? Да, я вижу, что по заданию не требуется, но вы всё-таки подумайте. Подсказка - это к тому, что надо избавиться от глобалок.
1
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 5
24.09.2020, 14:19  [ТС]
Большое спасибо за советы, задачу решил.

Вот итоговый код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import argparse, os, json, tempfile
 
parser = argparse.ArgumentParser()
parser.add_argument("--key", help=' random text')
parser.add_argument("--val", help='random_text')
args = parser.parse_args()
 
storage_path = os.path.join(tempfile.gettempdir(), 'storage.data')
 
if os.path.isfile(storage_path):
    if args.val:
        with open(str(storage_path), "r") as f:
            m = json.load(f)
            if args.key in m:
                m[args.key] = m[args.key] + [args.val]
            else:
                m.update({args.key: [args.val]})
        with open(str(storage_path), "w") as f:
            json.dump(m, f)
    else:
        try:
            with open(str(storage_path), "r") as f:
                m = json.load(f)
                if m[args.key] == None:
                    print(None)
                if len(m[args.key]) > 1:
                    print(', '.join(m.get(args.key)))
                else:
                    print(*m.get(args.key))
        except:
            print(None)
else:
    d = {}
    with open(str(storage_path), "w") as f:
        if args.val:
            d = {args.key: [args.val]}
            json.dump(d, f)
        else:
            d = {args.key: None}
            print(None)
Добавлено через 4 минуты
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Вы строку 'abc' выводите посимвольно.
Это было очевидно, просто не мог придумать, как это изменить. Спасибо за помощь
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
24.09.2020, 16:18
Подсказка:
Python
1
2
3
class Storage(object):
    def __init__(self, filename)
        self.f = open(filename, ...)
И не надо open(...) as f на каждый чих. ВСЕ методы по чтению\записи в файл - должны стать методами этого класса.
"if args.val" в коде должно быть строго один раз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.09.2020, 16:18
Помогаю со студенческими работами здесь

Задание по программированию
Дано TYPE PREAL=^REAL; VECTOR=ARRAY OF PREAL; VAR X:VECTOR *-X:^VECTOR В...

задание по программированию
надо написать код программы

Задание по программированию
Срочно нужно помочь с заданием (номер 11). Я вообще не понимаю, как его делать.

Задание по программированию
Здраствуйте обитатели форума. Задали мне задачку по программированию и нужно написать код этой задачи. Прошу пожалуйста помочь так как...

Задание по программированию
Добрый вечер, помогите пожалуйста сделать задание, нужно написать на c++ /************************************************************* ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru