2013-08-27 9 views
20

Sto utilizzando argparse per inserire l'input da riga di comando e anche per produrre testo di aiuto. Voglio usare ArgumentDefaultsHelpFormatter come formatter_class, tuttavia questo mi impedisce di usare anche RawDescriptionHelpFormatter che mi permetterebbe di aggiungere una formattazione personalizzata alla mia descrizione o epilog.ArgumentParser epilog e descrizione della formattazione in combinazione con ArgumentDefaultsHelpFormatter

Esiste un metodo ragionevole per ottenere questo oltre alla scrittura di codice per produrre il testo per i valori predefiniti? Secondo i documenti argparse, tutti gli interni di ArgumentParser sono considerati dettagli di implementazione, non API pubblica, quindi la sottoclassificazione non è un'opzione interessante.

risposta

28

Ho appena provato un approccio multiplo eredità, e funziona:

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

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

Questo può rompersi se la struttura interna di queste classi cambiano però.

+0

La sottoclasse in questo modo non dipende dall'interno. Se l'ereditarietà multipla funziona ora, dovrebbe avvenire in tutte le future modifiche. Come mostra la mia soluzione, le due classi stanno modificando diversi metodi di formattazione. – hpaulj

+0

Un altro esempio che utilizza questa ereditarietà multipla: http://stackoverflow.com/questions/23567393/pythons-argh-library-preserve-docstring-formatting-in-help-message/23583350#23583350 – hpaulj

+0

@hpaulj I metodi di formattazione non sono parte dell'API pubblica. Dalla docstring di 'argparse.HelpFormatter':' Solo il nome di questa classe è considerato un'API pubblica. Tutti i metodi forniti dalla classe sono considerati un dettaglio di implementazione. Entrambe le classi potrebbero essere interamente riscritte. – timdiels

1

Non vedo perché la sottoclasse di un HelpFormatter dovrebbe essere un problema. Quello non sta scherzando con gli interni di ArgumentParser. La documentazione contiene esempi di classi personalizzate Action e Type (o funzioni). Prendo la linea 'there are four such classes' come un invito a scrivere il mio HelpFormatter, se necessario.

Le sottoclassi HelpFormatter fornite apportano modifiche piuttosto semplici, cambiando solo una funzione. Quindi possono essere facilmente copiati o modificati.

RawDescription cambia solo:

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

In teoria potrebbe essere modificato senza alterare l'API, ma è improbabile.

Il default formattatore cambia solo:

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 

si potrebbe ottenere lo stesso effetto, semplicemente includendo %(default)s in tutte le linee di aiuto di argomenti. In contrasto con le sottoclassi Raw, questa è solo una classe di convenienza. Non ti dà più controllo sulla formattazione.

Problemi correlati