python argparse - Как предотвратить с помощью комбинации аргументов - PullRequest
0 голосов
/ 03 августа 2020

В argparse я хочу предотвратить конкретную комбинацию аргументов. Давайте посмотрим на пример кода.

Пример:

import argparse

parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('--firstname', dest='fn', action='store')
parser.add_argument('--lastname', dest='ln', action='store')
parser.add_argument('--fullname', dest='full', action='store')
args = parser.parse_args()

Например: --firstname --lastname --fullname

Пользователь может запустить код за 2 дня.

Способ 1:

code.py --firstname myfirst --lastname mylast

Способ 2:

code.py --fullname myfullname

Предотвратить

Мы не должны использовать комбинацию fistname, fullname или lastname, fullname. Если мы используем оба, то он не должен выполняться.

Может ли кто-нибудь помочь мне исправить это?

Ответы [ 3 ]

2 голосов
/ 03 августа 2020

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

пример (при условии, что результат синтаксического анализа находится в argsvalue):

if argsvalue.fullname and (argsvalue.firstname or argsvalue.lastname):
   print ("missuse of name options.....")

Предполагается, что значение argparse по умолчанию для переменных равно None (тогда, если в них что-то установлено, они будут проверять значение true с logi c выше ...

0 голосов
/ 03 августа 2020

Подобно этому ответ предлагает (по аналогичному вопросу) вы можете сделать что-то вроде следующего, используя субпарсеры для обоих случаев:

# create the top-level parser
parser = argparse.ArgumentParser(add_help=false)
subparsers = parser.add_subparsers(help='help for subcommands')

# create the parser for the "full_name" command
full_name = subparsers.add_parser('full_name', help='full_name help')
full_name.add_argument('--fullname', dest='full', action='store')

# create the parser for the "separate_names" command
separate_names = subparsers.add_parser('separate_names', help='separate_names help')
separate_names.add_argument('--firstname', dest='fn', action='store')
separate_names.add_argument('--lastname', dest='ln', action='store')

args = parser.parse_args()

Вы можете улучшить его еще больше, потребовав как имя, так и фамилия пользователя, поскольку это обычно имеет смысл.

0 голосов
/ 03 августа 2020

Вы можете разделить свои аргументы на отдельные команды и использовать подпараметры, например:

import argparse


parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

parser_clean = subparsers.add_parser('clean', description='clean build folder')
parser_clean.add_argument('--all', help='clean build folder and logs', action='store_true')

parser_deploy = subparsers.add_parser('deploy')
parser_deploy.add_argument('object')
parser_deploy.add_argument('--nc', help='no cleanup', action='store_true')

args = parser.parse_args()
...