DarkWood
@DarkWood

Как правильно обработать None для аргументов в argparse?

Здравствуйте.

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

У скрипта есть поведение по умолчанию, если аргументы не были переданы совсем. Потом уже идет их вызов. Но если хотя бы один дан не был, то я получаю логичную ошибку о том, что None в таком-то и таком-то случае использовать нельзя.

Собственно, вопрос: как организовать проверку сего момента? Или мною был выбран вовсе неправильный подход?

import argparse
import json
import sys


def add_item(string):
    k, v = string.split(",")
    with open("test.json", "r", encoding="utf8") as in_file:
        db = json.load(in_file)
        if k in db:
            db[k] = v
        else:
            db[k] = v
    with open("test.json", "w", encoding="utf8") as out_file:
        json.dump(db, out_file, ensure_ascii=False)


def check_item(string):
    with open("test.json", "r", encoding="utf8") as in_file:
        db = json.load(in_file)
    if string in db:
        print(db[string])
    else:
        print("Don't found key: " + string)


parser = argparse.ArgumentParser()

parser.add_argument('-a', '--add', action='store', dest='add_value',
                    help='Add value to dictionary')

parser.add_argument('-v', '--value', action='store', dest='check_value',
                    help='Check value in dictionary')

if __name__ == "__main__":
    namespace = parser.parse_args(sys.argv[1:])
    if not len(sys.argv) > 1:
        with open("test.json", "r", encoding="utf8") as in_file:
            database = json.load(in_file)
        for key, value in database.items():
            print(key + " - " + value)
    else:
        add_item(namespace.add_value)
        check_item(namespace.check_value)
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 1
@o5a
else:
        add_item(namespace.add_value)
        check_item(namespace.check_value)

Обе запускаются безусловно, независимо от заполнения параметров в namespace. Так что или добавить условие заполненности соответствующего параметра add_value/check_value, и потом запускать соответствующую процедуру, или же, если идея была всегда запускать отображение значения, то вместо разделения на add/check_value, сразу распарсить ввод на param, value и уже их передавать в свою функцию, например так
else:
        param, value = namespace.add_value.split(",") if namespace.add_value else [namespace.check_value, None]
        add_item(param, value)
        check_item(param)

И соответственно изменить add_item/check_item, чтобы работали уже с параметром как таковым.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы