2016-08-19 3 views
2

Я использую argparse, и у меня есть группа настраиваемых аргументов required arguments. Есть ли способ изменить порядок групп аргументов в сообщении справки? Я думаю, что логичнее иметь требуемые аргументы перед необязательными аргументами, но не нашли никакой документации или вопросов, которые помогут.Переупорядочить группы аргументов аргументов аргумента Python

Например, это изменить:

usage: foo.py [-h] -i INPUT [-o OUTPUT] 

Foo 

optional arguments: 
    -h, --help   show this help message and exit 
    -o OUTPUT, --output OUTPUT 
         Output file name 

required arguments: 
    -i INPUT, --input INPUT 
         Input file name 

к этому:

usage: foo.py [-h] -i INPUT [-o OUTPUT] 

Foo 

required arguments: 
    -i INPUT, --input INPUT 
         Input file name 

optional arguments: 
    -h, --help   show this help message and exit 
    -o OUTPUT, --output OUTPUT 
         Output file name 

(пример взят из this question)

ответ

4

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

import argparse 

parser = argparse.ArgumentParser(description='Foo', add_help=False) 

required = parser.add_argument_group('required arguments') 
required.add_argument('-i', '--input', help='Input file name', required=True) 

optional = parser.add_argument_group('optional arguments') 
optional.add_argument("-h", "--help", action="help", help="show this help message and exit") 
optional.add_argument('-o', '--output', help='Output file name', default='stdout') 

parser.parse_args(['-h']) 

Вы можете перемещать помощи действия в вашей опциональной группы как описанной здесь: Move "help" to a different Argument Group in python argparse

Как вы можете видеть, код производит требуемую мощность:

usage: code.py -i INPUT [-h] [-o OUTPUT] 

Foo 

required arguments: 
    -i INPUT, --input INPUT 
         Input file name 

optional arguments: 
    -h, --help   show this help message and exit 
    -o OUTPUT, --output OUTPUT 
         Output file name 
2

Анализатор начинается с 2-х аргументов групп , обычный positional и optionals. Справка -h добавлена ​​к optionals. Когда вы делаете add_argument_group, группа создается (и возвращается вам). Он также прилагается к списку parser._action_groups.

При обращении за помощью (-h) вызывается parser.format_help() (вы можете это сделать и при тестировании). Посмотрите на этот метод в argparse.py. Это создает сообщение справки, и один шаг:

# positionals, optionals and user-defined groups 
    for action_group in self._action_groups: 
     formatter.start_section(action_group.title) 
     formatter.add_text(action_group.description) 
     formatter.add_arguments(action_group._group_actions) 
     formatter.end_section() 

Так что, если мы изменить порядок элементов в списке parser._action_groups, мы будем изменять порядок группы на дисплее. Поскольку это единственное использование _action_groups, оно должно быть безопасным и легким. Но некоторым людям не разрешено пик под обложками (посмотрите или измените атрибуты ._).

Предлагаемое решение (ы) состоит в том, чтобы создавать собственные группы в том порядке, в котором вы хотите их видеть, и убедитесь, что группы по умолчанию пустые (параметр add_help=False). Это единственный способ сделать это, если вы придерживаетесь общедоступного API.

Демо:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('foo') 
g1 = parser.add_argument_group('REQUIRED') 
g1.add_argument('--bar', required=True) 
g1.add_argument('baz', nargs=2) 

print(parser._action_groups) 
print([group.title for group in parser._action_groups]) 
print(parser.format_help()) 

parser._action_groups.reverse() # easy inplace change 
parser.print_help() 

результат Run:

1504:~/mypy$ python stack39047075.py 

_actions_group список и названия:

[<argparse._ArgumentGroup object at 0xb7247fac>, 
<argparse._ArgumentGroup object at 0xb7247f6c>, 
<argparse._ArgumentGroup object at 0xb721de0c>] 
['positional arguments', 'optional arguments', 'REQUIRED'] 

по умолчанию помощь:

usage: stack39047075.py [-h] --bar BAR foo baz baz 

positional arguments: 
    foo 

optional arguments: 
    -h, --help show this help message and exit 

REQUIRED: 
    --bar BAR 
    baz 

после реверса:

usage: stack39047075.py [-h] --bar BAR foo baz baz 

REQUIRED: 
    --bar BAR 
    baz 

optional arguments: 
    -h, --help show this help message and exit 

positional arguments: 
    foo 
1504:~/mypy$ 

Другой способ реализовать это определить ArgumentParser подкласс с новым методом format_help. В этом методе выполняется переупорядочение списка, используемого в этом цикле for action_group....

0

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

parser._action_groups.reverse() 

Это будет эффективно сделать требуемое отображение аргументов группы выше необязательных аргументов группа. Обратите внимание: этот ответ должен быть описательным, а не предписывающим.


Кредит: answer by hpaulj

Смежные вопросы