Napotkałem podobny problem (Python 2.7.6). Próbowałem rozbić opis rozdział na kilka linii z wykorzystaniem RawTextHelpFormatter
:
parser = ArgumentParser(description="""First paragraph
Second paragraph
Third paragraph""",
usage='%(prog)s [OPTIONS]',
formatter_class=RawTextHelpFormatter)
options = parser.parse_args()
I got:
usage: play-with-argparse.py [OPTIONS]
First paragraph
Second paragraph
Third paragraph
optional arguments:
-h, --help show this help message and exit
Więc RawTextHelpFormatter
nie jest rozwiązaniem. Ponieważ wypisuje opis w postaci kodu źródłowego, zachowując wszystkie znaki odstępu (chcę zachować dodatkowe zakładki w moim kodzie źródłowym, aby móc je odczytać, ale nie chcę ich wszystkich drukować.) Również formatowanie raw nie owija wiersza, gdy jest on zbyt długi, na przykład ponad 80 znaków).
Dzięki @Anton, który zainspirował właściwy kierunek above. Ale to rozwiązanie wymaga niewielkich modyfikacji w celu sformatowania sekcji opis.
W każdym razie potrzebny jest niestandardowy formater. I przedłużony istniejących HelpFormatter
klasę i overrode _fill_text
metody takie jak to:
import textwrap as _textwrap
class MultilineFormatter(argparse.HelpFormatter):
def _fill_text(self, text, width, indent):
text = self._whitespace_matcher.sub(' ', text).strip()
paragraphs = text.split('|n ')
multiline_text = ''
for paragraph in paragraphs:
formatted_paragraph = _textwrap.fill(paragraph, width, initial_indent=indent, subsequent_indent=indent) + '\n\n'
multiline_text = multiline_text + formatted_paragraph
return multiline_text
porównać z oryginalnym kodem źródłowym pochodzące z modułu argparse:
def _fill_text(self, text, width, indent):
text = self._whitespace_matcher.sub(' ', text).strip()
return _textwrap.fill(text, width, initial_indent=indent,
subsequent_indent=indent)
W oryginalnym kodzie cały opis jest zawinięty.W edytorze niestandardowym powyżej cały tekst jest podzielony na kilka części, a każdy z nich jest formatowany niezależnie.
Więc z pomocą niestandardowego formater:
parser = ArgumentParser(description= """First paragraph
|n
Second paragraph
|n
Third paragraph""",
usage='%(prog)s [OPTIONS]',
formatter_class=MultilineFormatter)
options = parser.parse_args()
wyjście jest:
usage: play-with-argparse.py [OPTIONS]
First paragraph
Second paragraph
Third paragraph
optional arguments:
-h, --help show this help message and exit
Nie mam Pythona 2.7 ze mną, więc mogę przetestować moje pomysły. Co powiesz na temat używania tekstu pomocy w potrójnych cudzysłowach ("" "" ""). Czy nowe linie przetrwają z tego powodu? – pyfunc
@pyfunc: Nie. Rozbijanie odbywa się w czasie pracy przez 'argparse', nie tłumacza, więc przełączenie na' "" "..." "" nie pomoże. – kennytm