Durante la ricerca di metodi più veloci per analizzare gli argomenti della riga di comando nei miei script, mi sono imbattuto nello argh library.Libreria argh di Python: preservare la formattazione della docstring nel messaggio di aiuto
Mi piacciono molto le funzionalità di argh ma ho riscontrato uno svantaggio che mi impedisce di utilizzarlo, e questo ha a che fare con il messaggio di aiuto predefinito che viene visualizzato se sto richiamando l'opzione -help: per l'impostazione predefinita della docstring della funzione viene visualizzata in cima all'elenco degli argomenti. Questo è ottimo, tuttavia la formattazione iniziale è persa. Si veda, ad esempio, il seguente script di esempio
import argh
def func(foo=1, bar=True):
"""Sample function.
Parameters:
foo: float
An example argument.
bar: bool
Another argument.
"""
print foo, bar
argh.dispatch_command(func, argv=['-h'])
che comporterebbe il seguente output
usage: script.py [-h] [-f FOO] [-b]
Sample function. Parameters: foo: float An example argument. bar: bool Another
argument.
optional arguments:
-h, --help show this help message and exit
-f FOO, --foo FOO
-b, --bar
C'è un (facile) modo per ottenere un output simile al seguente?
usage: script.py [-h] [-f FOO] [-b]
Sample function.
Parameters:
foo: float
An example argument.
bar: bool
Another argument.
optional arguments:
-h, --help show this help message and exit
-f FOO, --foo FOO
-b, --bar
Preferirei non usare le annotazioni per definire i messaggi tesi di aiuto dal momento che mi richiederebbe di modificare sia docstring della funzione e il testo di aiuto ogni volta che c'è qualcosa per cambiare.
Grazie a @hpaulj, questo risolve la mia domanda iniziale (e immedamente ne porta un'altra), perché con la modifica 'PARSER_FORMATTER = argparse.ArgumentDefaultsHelpFormatter' a' PARSER_FORMATTER = argparse.RawDescriptionHelpFormatter' Perdo la possibilità di visualizzare i miei valori predefiniti . C'è un modo per avere entrambi, cioè conservare la formattazione e vedere i valori predefiniti accanto agli argomenti facoltativi? Inoltre, se 'ArgumentDefaultsHelpFormatter' è il valore predefinito di' PARSE_FORMATTER', perché non vedo i valori 'foo = 1' e' bar = True' nel messaggio di aiuto del mio esempio? – nilfisque
In 'constants.py',' PARSER_FORMATTER = argparse.ArgumentDefaultsHelpFormatter'. Questo formattatore include i valori predefiniti nelle linee guida. Quindi con il cambiamento ottieni una caratteristica e ne perdi un'altra. Probabilmente devi costruire la tua classe di formattazione per ottenere entrambe le funzionalità. – hpaulj
Grazie, seguendo il consiglio di [qui] (https://stackoverflow.com/questions/18462610/argumentaparser-epilog-and-description-formatting-in-conjunction-with-argumentdef) si può effettivamente generare una classe che eredita da entrambi i formattatori e dovrebbe risultare in una combinazione di entrambi. Tuttavia, è strano che nessun valore di default venga stampato anche con l'originale 'PARSER_FORMATTER = argparse.ArgumentDefaultsHelpFormatter'. – nilfisque