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 .

  • python argparse: Как я могу автоматически отображать справку об ошибке?
  • структура выборки аргумент-аргумент допустимых значений
  • Argparse: Способ включения значений по умолчанию в '--help'?
  • argparse - как перейти к методу с kwargs или argv
  • Почему API-интерфейс Python использует код ошибки 2 для SystemExit?
  • Python argparse как функция
  • ArgumentParser: дополнительный аргумент с дополнительным значением
  • Вызов функций с помощью argparse
  • Функция вызова на основе argparse
  • Argparse nargs = "+" употребляет позиционный аргумент
  • argparse необязательный subparser (для --version)
  • Python - лучший язык программирования в мире.