Подтвердить что ты не робот

ArgumentParser epilog и форматирование описания в сочетании с ArgumentDefaultsHelpFormatter

Я использую argparse для ввода ввода командной строки, а также для создания текста справки. Я хочу использовать ArgumentDefaultsHelpFormatter как formatter_class, однако это мешает мне также использовать RawDescriptionHelpFormatter, который позволит мне добавить настраиваемое форматирование в мое описание или epilog.

Есть ли разумный метод достижения этого, помимо написания кода, для создания текста значений по умолчанию? Согласно документам argparse, все внутренние элементы ArgumentParser рассматриваются как детали реализации, а не публичный API, поэтому подкласс не является привлекательным вариантом.

4b9b3361

Ответ 1

Я просто попробовал метод множественного наследования, и он работает:

class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter):
    pass

parser = argparse.ArgumentParser(description='test\ntest\ntest.',
                                 epilog='test\ntest\ntest.',
                                 formatter_class=CustomFormatter)

Это может нарушиться, если внутренние элементы этих классов меняются.

Ответ 2

Я не понимаю, почему проблема с подклассом HelpFormatter должна быть проблемой. Это не возится с внутренними элементами ArgumentParser. В документации есть примеры пользовательских классов Action и Type (или функций). Я беру строку 'there are four such classes', чтобы пригласить написать собственный HelpFormatter, если это необходимо.

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

RawDescription только изменения:

def _fill_text(self, text, width, indent):
    return ''.join(indent + line for line in text.splitlines(keepends=True))

В теории это может быть изменено без изменения API, но это маловероятно.

Форматирование по умолчанию изменяется только:

def _get_help_string(self, action):
    help = action.help
    if '%(default)' not in action.help:
        if action.default is not SUPPRESS:
            defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
            if action.option_strings or action.nargs in defaulting_nargs:
                help += ' (default: %(default)s)'
    return help

Вы можете получить тот же эффект, просто включив %(default)s во все строки справки по аргументам. В отличие от подклассов Raw это просто класс удобства. Это не дает вам больше контроля над форматированием.