@vlad_horenko
Хочу стать Python разработчиком

Как решить задачу на Python?

Есть задача:
Пример работы утилиты:
Сохранение значения value по ключу key_name:
$ storage.py --key key_name --val value
Получение значения по ключу key_name:
$ storage.py --key key_name
Задача: написать реализацию утилиты storage.py.
Утилита может вызваться со следующими параметрами:
--key <имя ключа> , где <имя ключа> - ключ по которому сохраняются/получаются значения
--val <значение>, где <значение> - сохраняемое значение.
Если при запуске утилиты переданы оба ключа, происходит добавление переданного значения по ключу и сохранение данных в файле. Если передано только имя ключа, происходит чтение файла хранилища и вывод на печать значений, которые были сохранены по данному ключу.  Обратите внимание, что значения по одному ключу не перезаписываются, а добавляются к уже сохраненным. Другими словами - по одному ключу могут храниться несколько значений. При выводе на печать, значения выводятся в порядке их добавления в хранилище. Формат вывода на печать для нескольких значений:
value_1, value_2
Обратите внимание на пробел после запятой. Если значений по ключу не было найдено, выведите пустую строку или None.
Для работы с аргументами командной строки используйте модуль argparse. Хранить данные в файле мы рекомендуем в формате JSON с помощью использования модуля стандартной библиотеки  json. Прежде чем отправлять ваше решение на проверку, протестируйте работу вашей утилиты на добавление нескольких ключей и разных значений.
Файл следует создавать с помощью модуля tempfile.
import os
import tempfile

storage_path = os.path.join(tempfile.gettempdir(), 'storage.data')
with open(storage_path, 'w') as f:
  ...
Пример работы:
$ 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

Я ее решил вот так:
import os
import sys
import tempfile
import json

storage_path = os.path.join(tempfile.gettempdir(), 'storage.data')
storage = {}
def key(dictionary, key):
    dictionary.update(key, None)
def key_and_value(dictionary, key, value):
    dictionary.update(key, value)
with open(storage_path, 'w') as f:
    if len(sys.argv) <= 3 and sys.argv[1] == '--key':
        if sys.argv[2] not in storage:
            key(storage, sys.argv[2])
            json.dump(storage, f)
        if sys.argv[2] in storage:
            with open(storage_path, 'w') as f:
                storage.get(key[sys.argv[2]])
    if len(sys.argv) > 3 and (sys.argv[1] == '--key' and sys.argv[3] == '--val'):
        key_and_value(storage, sys.argv[2], sys.argv[4])
        json.dump(storage, f)

Но у меня есть ошибки в ходе выполнения данной программы.
Пожалуйста, буду очень благодарен, если вы мне объясните как решить эту задачу, и покажите что у меня было не так.
  • Вопрос задан
  • 589 просмотров
Решения вопроса 1
includedlibrary
@includedlibrary
Вы аргументы не правильно разбираете. Например,

if len(sys.argv) <= 3 and sys.argv[1] == '--key':
        if sys.argv[2] not in storage:


Если аргументов меньше или три, вы обращаетесь ко второму и третьему аргументу. Ноль аргументов под это условие подходит, поэтому у вас программа и крашится.

Ещё пример,
if sys.argv[2] in storage:
    with open(storage_path, 'w') as f:
        storage.get(key[sys.argv[2]])


Если в хранилище есть ключ, открываем файл и достаём из хранилища значение. Во-первых на данный момент, этот файл уже открыт, во-вторых вы не считываете значения из него в переменную storage, в-третьих вы достаёте значение из storage, но не выводите его в консоль.

Ещё неверный кусок:
def key_and_value(dictionary, key, value):
    dictionary.update(key, value)


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

Войдите, чтобы написать ответ

Похожие вопросы