Argparse – одновременный доступ к нескольким аргументам

мое приложение использует базу данных, поэтому при добавлении нового элемента (из командной строки) я хочу проверить, уже ли это в базе данных, что я делаю с параметром «type» add_argument:

def check_uniq(project_name): if Project.exists(project_name): raise argparse.ArgumentTypeError( return project_name 

это работает очень хорошо, однако, чтобы сделать более понятным конечный пользователь, я хотел бы добавить параметр --force к моим аргументам, чтобы эта переменная была протестирована и удалена перед тем, чтобы добавить, и в этом случае обратите внимание на поднятие аргумента. Как я могу получить доступ в опции check_uniq к параметру –force?

2 Solutions collect form web for “Argparse – одновременный доступ к нескольким аргументам”

Проверьте, если параметр установлен в том же самом if скрепление:

 def check_uniq(project_name, options): if Project.exists(project_name) and not options.force: raise argparse.ArgumentTypeError('Project already exists') return project_name 

где options принимает экземпляр Namespace возвращаемый parser.parse_args() .

К сожалению, вы не можете проверить это до тех пор, пока все аргументы не будут проанализированы, вы не сможете использовать эту функцию в качестве параметра type , поскольку параметр --force может быть указан где угодно в командной строке до или после параметра, который указывает название вашего проекта.

Если вам требуется, чтобы параметр --force был указан перед любыми проектами в командной строке, вместо этого вы можете использовать настраиваемое action ; настраиваемое действие передается объекту namespace как анализируемый до сих пор :

 class UniqueProjectAction(argparse.Action): def __call__(self, parser, namespace, value, option_string=None): if Project.exists(value) and not namespace.force: raise argparse.ArgumentTypeError('Project already exists') setattr(namespace, self.dest, values) 

Цель функции type – преобразовать строку аргумента в какой-либо другой объект ( int , float , file ). Он не имеет доступа к namespace или другим атрибутам анализатора. Косвенно он имеет доступ к глобальному состоянию, например, при попытке открыть файл в FileType .

action имеет доступ к namespace , хотя обычно это предназначено для установки значения (атрибута). Он может проверять значения других атрибутов, но это ограничивает порядок, в котором устанавливаются атрибуты (например, --force должен прибыть перед database ).

Вы также можете проверить атрибуты namespace после parse_args . Вы все еще можете использовать механизм ошибки argparse , вызывая parser.error('your message') . На этом этапе может быть проще проверить значения, так как вам не нужно беспокоиться о порядке строк в sys.argv .

  • Перезаписывание API Диска Google v3 Argparse в Python
  • Python argparse Необязательный аргумент работает только тогда, когда он вводится в правильные позиции
  • Можно ли использовать argparse для захвата произвольного набора необязательных аргументов?
  • Отключить аббревиатуру в argparse
  • типы путей каталога с помощью argparse
  • Параметр парсера аргументов Python списка или кортежей кортежей
  • Использование Argparse с API администратора Google
  • Пространство имен, argparse и использование
  •  
    Interesting Posts for Van-Lav

    Как открыть консоль разработчика Chrome с помощью Selenium в Python?

    Несколько выходных файлов для потоковой передачи Hadoop с помощью Python Mapper

    загрузить csv в 2D-матрицу с numpy для построения графика

    Как подождать, пока в Python не будет завершен только первый поток

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

    Получить версию Django для приложения

    SSLError с использованием запросов для python

    Есть ли в Pandas питонический способ сделать таблицу непредвиденных обстоятельств?

    Как вставить LabelKFold?

    LiveServerTestCase Django всегда сбой из-за конфликтующего адреса … Несмотря на отсутствие адреса

    фатальная ошибка: файл «string.h» не найден после обновления до python 3.2 и установки определенных модулей из virtualenv

    Почему мой обработчик click ttk.Treeview возвращает неправильный элемент в tree.focus ()?

    проанализировать журнал сеансов whatsApp

    В numpy, как эффективно перечислить все подматрицы фиксированного размера?

    Построение линий тока с помощью Matplotlib – Python

    Python - лучший язык программирования в мире.