Ich habe ein ähnliches Problem (Python 2.7.6) konfrontiert. Ich habe versucht, aufzubrechen Beschreibung Abschnitt in mehrere Zeilen mit RawTextHelpFormatter
:
parser = ArgumentParser(description="""First paragraph
Second paragraph
Third paragraph""",
usage='%(prog)s [OPTIONS]',
formatter_class=RawTextHelpFormatter)
options = parser.parse_args()
Und bekam:
usage: play-with-argparse.py \[OPTIONS\]
First paragraph
Second paragraph
Third paragraph
optional arguments:
-h, --help show this help message and exit
Also RawTextHelpFormatter
ist keine Lösung. Denn die Beschreibung wird so gedruckt, wie sie im Quellcode erscheint, wobei alle Leerzeichen erhalten bleiben (ich möchte aus Gründen der Lesbarkeit zusätzliche Tabulatoren in meinem Quellcode behalten, aber ich möchte sie nicht alle drucken. Außerdem bricht der Rohformatierer eine Zeile nicht um, wenn sie zu lang ist, z. B. mehr als 80 Zeichen).
Dank an @Anton, der die richtige Richtung vorgab über . Diese Lösung muss jedoch geringfügig geändert werden, um Folgendes zu formatieren Beschreibung Abschnitt.
Auf jeden Fall wird ein benutzerdefinierter Formatierer benötigt. Ich habe das bestehende HelpFormatter
Klasse und überschreibt _fill_text
Methode wie folgt:
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
Vergleichen Sie mit dem Original-Quellcode, der von argparse Modul:
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)
Im ursprünglichen Code wird die gesamte Beschreibung umbrochen. Im obigen benutzerdefinierten Formatierer wird der gesamte Text in mehrere Abschnitte aufgeteilt, und jeder von ihnen wird unabhängig formatiert.
Also mit Hilfe eines benutzerdefinierten Formatierers:
parser = ArgumentParser(description= """First paragraph
|n
Second paragraph
|n
Third paragraph""",
usage='%(prog)s [OPTIONS]',
formatter_class=MultilineFormatter)
options = parser.parse_args()
ist die Ausgabe:
usage: play-with-argparse.py \[OPTIONS\]
First paragraph
Second paragraph
Third paragraph
optional arguments:
-h, --help show this help message and exit