Использование числового идентификатора для выбора значения в click.Choice - PullRequest
0 голосов
/ 22 января 2019

Пакет Click позволяет выбрать диапазон значений из списка с помощью метода click.Choice .

В моем случае значения относительно длинныестроки, поэтому с помощью:

choice_names = [u'Vulnerable BMC (IPMI)', u'IoT Vulnerability', u'SMBv1', u'BadHTTPStatus', u'Compromised']

@click.option('--category', prompt='\nPlease enter the category of incident.\n\n -- Options:\n{}\n\n'.format(
    format_choices(choice_names)), type=click.Choice(choice_names))

будут перечислены значения в виде:

-> Vulnerable BMC (IPMI)
-> IoT Vulnerability
-> SMBv1
-> BadHTTPStatus
-> Compromised

Это требует от пользователя ввода полной строки, что неудобно.Предоставляет ли Click функциональность для выбора значения, используя только числовой идентификатор?Таким образом, перечисленные выше параметры могут быть перечислены как:

-> Vulnerable BMC (IPMI) [1]
-> IoT Vulnerability [2]
-> SMBv1 [3]
-> BadHTTPStatus [4]
-> Compromised [5]

, и чтобы выбрать первый вариант, пользователь должен будет ввести 1.Это могло быть возможно путем определения пользовательской функции проверки, но я не смог найти ни одной существующей функциональности, предлагаемой Click.

1 Ответ

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

Так как Click, похоже, не обеспечивает такую ​​функциональность, эта пользовательская функция проверки выполняет цель:

def validate_choice(ctx, param, value):
    # Check if the passed value is an integer.
    try:
        index = int(value) - 1
        # Return the value at the given index.
        try:
            return choice_names[index]
        # If the index does not exist.
        except IndexError:
            click.echo('Please select a valid index.')
    # If the value is of a different type, for example, String.
    except (TypeError, ValueError):
        # Return the value if it exists in the list of choices.
        if value in choice_names:
            return value
        else:
            click.echo('Please select a valid value from the choices {}.'.format(choice_names))

    # Prompt the user for an input.
    value = click.prompt(param.prompt)
    return validate_choice(ctx, param, value)

@click.option('--category', prompt='\nPlease enter the category.\n\n -- Options:\n{}\n\n'.format(choice_names),
              help='Category of the incident', callback=validate_category)

Это позволяет пользователю выбирать выбор либо путем ввода имени выбора, либо путем ввода значения индекса. Если введено неверное значение, пользователю снова предлагается ввести данные.

...