ArgumentParser epilog и форматирование описания в сочетании с ArgumentDefaultsHelpFormatter
Я использую argparse для ввода ввода командной строки, а также для создания текста справки. Я хочу использовать ArgumentDefaultsHelpFormatter
как formatter_class
, однако это мешает мне также использовать RawDescriptionHelpFormatter
, который позволит мне добавить настраиваемое форматирование в мое описание или epilog.
Есть ли разумный метод достижения этого, помимо написания кода, для создания текста значений по умолчанию? Согласно документам argparse, все внутренние элементы ArgumentParser
рассматриваются как детали реализации, а не публичный API, поэтому подкласс не является привлекательным вариантом.
Ответы
Ответ 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
это просто класс удобства. Это не дает вам больше контроля над форматированием.