argparse — текст справки для вложенной функции add_argument_group() не отображается

#python #argparse

Вопрос:

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

 import argparse parser = argparse.ArgumentParser( formatter_class =  argparse.RawDescriptionHelpFormatter ) # add "level-1" argument group ag1Parser = parser.add_argument_group( 'OneTwo', 'The old one-two options.' ) ag1Parser.add_argument( '-one', action='store_true', help = '''Set one.''' ) ag1Parser.add_argument( '-two', action='store_true', help = '''Set two.''' ) ag2Parser = ag1Parser.add_argument_group( 'Two options', 'Options only for use with -two.' ) ag2Parser.add_argument( '-three', action = 'store_true', help = '''Set three.''' ) parser.parse_args(['-h'])  

выдает следующий результат:

 usage: [-h] [-one] [-two] [-three]  optional arguments:  -h, --help show this help message and exit  OneTwo:  The old one-two options.   -one Set one.  -two Set two.  

Вы можете видеть, что-три-это опция в первой строке вывода, и информация о группе аргументов 1-го уровня выводится, но информация о вложенной группе 2-го уровня не отображается. Кто-нибудь знает, как заставить это работать с текущим argparse? Если нет, стоит ли к этому что-то добавлять argparse , даже если для этого могут потребоваться ограничения по глубине?

Да, я знаю, что могу просто добавить полностью независимую группу аргументов, но я надеялся на что-то большее (т. Е. Вложенный вывод):

 usage: [-h] [-one] [-two] [-three]  optional arguments:  -h, --help show this help message and exit  OneTwo:  The old one-two options.   -one Set one.  -two Set two.   Two options:  Options only for use with -two.   -three Set three.  

Спасибо!

Комментарии:

1. Глядя на parser._actions , parser._action_groups и ag1Parser._action_groups я вижу, что группы были вложены , и все 3 аргумента находятся в parser , но средство форматирования справки не реализует рекурсивное отображение вложенных групп. Может ли это быть? может быть, но никто не сделал этой работы.

2. @hpaulj — спасибо, что посмотрели. Ценю ваш ответ.

3. Группы могут гнездиться, потому что они наследуются от того же абстрактного контейнерного класса, что и ArgumentParser. Взаимоисключающие группы также наследуют подобным образом. Но такого рода наследование классов не переносится в класс HelpFormatter. По сути, иерархия классов хорошо продумана и мощна, но слаба, когда дело доходит до того, чтобы убедиться, что все полностью функционально.