Расширение argparse для записи имен наборов в тексте справки для выбора необязательных аргументов и определения этих наборов один раз в конце

Пример проблемы

Если у меня есть список допустимых строк опций, который используется несколькими аргументами, этот список записывается в нескольких местах строки справки. Затрудняет чтение:

def main():
    elements = ['a', 'b', 'c', 'd', 'e', 'f']

    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-i',
        nargs='*',
        choices=elements,
        default=elements,
        help='Space separated list of case sensitive element names.')
    parser.add_argument(
        '-e',
        nargs='*',
        choices=elements,
        default=[],
        help='Space separated list of case sensitive element names to '
        'exclude from processing')

    parser.parse_args()

При запуске вышеуказанной функции с аргументом командной строки --helpотображается:

usage: arguments.py [-h] [-i [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]]
                    [-e [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]]

optional arguments:
  -h, --help            show this help message and exit
  -i [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]
                        Space separated list of case sensitive element names.
  -e [{a,b,c,d,e,f} [{a,b,c,d,e,f} ...]]
                        Space separated list of case sensitive element names
                        to exclude from processing

Что было бы хорошо

Было бы хорошо, если бы можно было определить имя списка опций, а в выводе справки напишите имя списка опций в нескольких местах и ​​определите его в последнюю очередь. Теоретически это будет работать так:

def main_optionlist():
    elements = ['a', 'b', 'c', 'd', 'e', 'f']

    # Two instances of OptionList are equal if and only if they
    # have the same name (ALFA in this case)

    ol = OptionList('ALFA', elements)

    parser = argparse.ArgumentParser()
    parser.add_argument(
        '-i',
        nargs='*',
        choices=ol,
        default=ol,
        help='Space separated list of case sensitive element names.')
    parser.add_argument(
        '-e',
        nargs='*',
        choices=ol,
        default=[],
        help='Space separated list of case sensitive element names to '
        'exclude from processing')

    parser.parse_args()

И при запуске вышеуказанной функции с аргументом командной строки --helpбудет показано нечто похожее на:

usage: arguments.py [-h] [-i [ALFA [ALFA ...]]]
                    [-e [ALFA [ALFA ...]]]

optional arguments:
  -h, --help            show this help message and exit
  -i [ALFA [ALFA ...]]
                        Space separated list of case sensitive element names.
  -e [ALFA [ALFA ...]]
                        Space separated list of case sensitive element names
                        to exclude from processing
sets in optional arguments:
  ALFA                  {a,b,c,d,e,f}

Вопрос

Мне нужно:

  • Замените отображаемые {'l', 'i', 's', 't', 's'} на имя параметра в необязательных аргументах.
  • В конце текста справки показать раздел, поясняющий, из каких элементов состоит каждое название опции.

Итак, я спрашиваю:

  1. Возможно ли это с помощью argparse?
  2. От каких классов я должен наследовать и какие методы мне нужно переопределить?

Я попытался просмотреть исходный код argparse, но, поскольку эта модификация кажется довольно сложной, я не знаю, с чего начать.

12
задан Deleted 14 March 2012 в 12:57
поделиться