Python Argparse: аргументы в необязательных аргументах - PullRequest
0 голосов
/ 19 февраля 2019

Я пишу скрипт, который может делать несколько вещей, в зависимости от аргументов, передаваемых в командной строке.Например:

#changed and simplified from actual code
parser.add_argument('-a','--apple')
parser.add_argument('-b','--boy')
parser.add_argument('-c', '--car')
parser.add_argument('-d', '--dog')
args = parser.parse_args()

Мне нужен только 1 аргумент в командной строке.Таким образом, будет принят только один из -a,-b,-c,-d, и тогда код будет выполняться в зависимости от того, какой аргумент был передан.

Я могу сделать это с помощью ряда операторов if, например

if args.a:
if args.b:

и т.д..Есть ли лучший способ приблизиться к этому?

Для каждой опции командной строки (-a,-b,-c,-d) я хотел бы передать некоторые аргументы. Эти аргументы будут конкретными и будут варьироваться в зависимости от начальной командной строкивариант.Например:

python test.py -a apple aardvark aquaman

Я подумал об использовании nargs, но я не был уверен, как сделать так, чтобы каждый аргумент был

  1. в правильном порядке и
  2. аргумент, который необходим.В приведенном выше примере, предполагая, что количество дополнительных необязательных аргументов будет равно 3, я хочу убедиться, что все аргументы начинаются с буквы a.

Как я могу подойти к этому?

1 Ответ

0 голосов
/ 19 февраля 2019

Вы можете определить взаимоисключающие параметры, используя add_mutually_exclusive_group():

group = parser.add_mutually_exclusive_group()
group.add_argument('-a','--apple')
group.add_argument('-b','--boy')
group.add_argument('-c', '--car')
group.add_argument('-d', '--dog')
args = parser.parse_args()

Что касается второй части, вы можете указать nargs и пользовательский type.type может быть просто функцией, которая принимает строку аргумента:

def check_a(val):
    if not val or not val[0] == 'a':
        raise argparse.ArgumentTypeError('Must be a value starting with a')
    return val

parser.add_argument('-a', '--apple', nargs=3, type=check_a)

Что касается порядка аргументов, передаваемых опции apple AFAIK, вы должны проверить ее после:

args = parser.parse_args()
if is_wrong_order(args.apple):
    parser.error('Incorrect argument order to apple')

В любом случае, в вашем случае вы, вероятно, захотите использовать подпарсер вместо опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...