2013-08-27 5 views
20

Ich verwende argparse, um in der Befehlszeile Eingabe und auch um Hilfetext zu produzieren. Ich möchte ArgumentDefaultsHelpFormatter als formatter_class verwenden, dies verhindert jedoch, dass ich auch RawDescriptionHelpFormatter verwende, was mir erlauben würde, meiner Beschreibung oder meinem Epilog benutzerdefinierte Formatierungen hinzuzufügen.ArgumentParser Epilog und Beschreibung Formatierung in Verbindung mit ArgumentDefaultsHelpFormatter

Gibt es eine vernünftige Methode, dies zu erreichen, abgesehen davon, Code zu schreiben, um Text für Standardwerte selbst zu erzeugen? Laut den Argarse-Dokumenten werden alle Interna von ArgumentParser als Implementierungsdetails und nicht als öffentliche API betrachtet, sodass Sub-Classing keine attraktive Option ist.

Antwort

28

Ich habe gerade versucht, eine Mehrfachvererbung Ansatz, und es funktioniert:

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

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

Diese brechen kann, wenn die Interna dieser Klassen allerdings ändern.

+0

Die Unterklassierung hängt nicht von den Einbauten ab. Wenn die Mehrfachvererbung jetzt funktioniert, sollte sie in Zukunft geändert werden. Wie meine Lösung zeigt, verändern die beiden Klassen verschiedene Formatierungsmethoden. – hpaulj

+0

Ein anderes Beispiel, das diese Mehrfachvererbung verwendet: http://stackoverflow.com/questions/23567393/pythons-argh-library-preserve-docstring-formatting-in-help-message/23583350#23583350 – hpaulj

+0

@hpaulj Die Formatierermethoden sind nicht Teil der öffentlichen API. Aus dem Docstring von 'argparse.HelpFormatter':' Nur der Name dieser Klasse wird als öffentliche API betrachtet. Alle von der Klasse bereitgestellten Methoden werden als Implementierungsdetail betrachtet. " Beide Klassen konnten komplett neu geschrieben werden. – timdiels

1

Ich sehe nicht, warum Unterklasse ein HelpFormatter sollte ein Problem sein. Das ist kein Problem mit den Interna von ArgumentParser. Die Dokumentation enthält Beispiele für benutzerdefinierte Klassen Action und Type (oder Funktionen). Ich nehme die 'there are four such classes' Linie, um eine Einladung zu sein, meinen eigenen HelpFormatter zu schreiben, wenn Sie benötigt werden.

Die bereitgestellten Unterklassen HelpFormatter machen ziemlich einfache Änderungen, indem sie nur eine Funktion ändern. So können sie leicht kopiert oder verändert werden.

RawDescription gerade ändert:

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

Theoretisch könnte es ohne Veränderung der API geändert werden, aber es ist unwahrscheinlich.

Die Standardwerte Formatierer ändert gerade:

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 

Sie könnten den gleichen Effekt erhalten, indem nur mit %(default)s in all Ihrer Argumentation Hotlines. Im Gegensatz zu den Unterklassen Raw ist dies nur eine Komfortklasse. Es gibt Ihnen nicht mehr Kontrolle über die Formatierung.

Verwandte Themen