Как выбрать аргумент + выбор аргумента и использовать оба варианта вместе в выражении - PullRequest
0 голосов
/ 30 января 2019

Работа с этим аргументом:

def get_args(arglist):
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description=textwrap.dedent('''
           text '''))
    parser.add_argument('--add',
                    default='',
                    nargs='?',
                    choices=['user', 'database'],
                    help='Add user or database (default: %(default)s)')

    args = parser.parse_args(arglist) # Passing argument list into parse
    args_dict = vars(args)  # Dictionary for args
    return args, args_dict  # Return the parsed arguments

Мне нужно выполнить логику, которая будет читать, какие choice были сделаны, и идти по пути операторов if, основанных на этом выборе.

Вот в основном то, что я пытаюсь сделать:

if args.add+args.user:
    print(f"do something to add user {args.add}")
if args.add+args.database:
    print(f"do something to add database {args.add}")

Я хочу, чтобы этот скрипт CLI знал, что пользователь пытается добавить (на данный момент, user или database).

Конечная цель состоит в том, чтобы пользователь ввел ./myscript.py --add user USERNAME, чтобы добавить пользователя.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

В дополнение к ответу Хемерсона вы можете также создать подпарасер с взаимоисключающей группой , содержащей аргументы --database и --user.

ВотНапример:

import argparse


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(dest='command')
    add_command = subparsers.add_parser('add', help='Add database or user.')
    add_group = add_command.add_mutually_exclusive_group(required=True)
    add_group.add_argument('--database')
    add_group.add_argument('--user')
    args = parser.parse_args()
    if args.command == 'add':
        if args.user:
            print('Adding user:', args.user)
        if args.database:
            print('Adding database:', args.database)

Теперь вы можете позвонить:

  • ./myscript.py add --database MYDB
  • ./myscript.py add --user MYUSER

Но не:

  • ./myscript.py add
  • ./myscript.py add --database MYDB --user MYUSER
0 голосов
/ 30 января 2019

Просто сравните значение, сохраненное в вашем аргументе, чтобы проверить, что было введено пользователем:

if args.add == 'user':
    print(f"do something to add user {args.add}")
if args.add == 'database':
    print(f"do something to add database {args.add}")

Для USERNAME или MYDB части

Решение, которое пришло мне на ум, - добавить еще один аргумент.Это может быть позиционный или необязательный параметр.

Позиционный:

parser.add_argument('name',
                    default='',
                    help='USERNAME or DATABASE name to be added (default: %(default)s)')

Вызов сценария: ./myscript.py USERNAME --add user или ./myscript.py MYDB --add database

Необязательно:

parser.add_argument('--name',
                    default='',
                    help='USERNAME or DATABASE name to be added (default: %(default)s)')

Сценарий вызова: ./myscript.py --add user --name USERNAME или ./myscript.py --add database --name MYDB

...