Ebbene, nessuna delle risposte finora sono abbastanza soddisfacente per una serie di motivi.Così qui è la mia risposta:
class ActionNoYes(argparse.Action):
def __init__(self, opt_name, dest, default=True, required=False, help=None):
super(ActionNoYes, self).__init__(['--' + opt_name, '--no-' + opt_name], dest, nargs=0, const=None, default=default, required=required, help=help)
def __call__(self, parser, namespace, values, option_string=None):
if option_string.starts_with('--no-'):
setattr(namespace, self.dest, False)
else:
setattr(namespace, self.dest, True)
E un esempio di utilizzo:
>>> p = argparse.ArgumentParser()
>>> p._add_action(ActionNoYes('foo', 'foo', help="Do (or do not) foo. (default do)"))
ActionNoYes(option_strings=['--foo', '--no-foo'], dest='foo', nargs=0, const=None, default=True, type=None, choices=None, help='Do (or do not) foo. (default do)', metavar=None)
>>> p.parse_args(['--no-foo', '--foo', '--no-foo'])
Namespace(foo=False)
>>> p.print_help()
usage: -c [-h] [--foo]
optional arguments:
-h, --help show this help message and exit
--foo, --no-foo Do (or do not) foo. (default do)
Purtroppo, la funzione _add_action
membro non è documentata, quindi questo non è 'ufficiale' in termini di essere supportato dall'API. Inoltre, Action
è principalmente una classe titolare. Ha un comportamento molto piccolo da solo. Sarebbe bello se fosse possibile usarlo per personalizzare un po 'di più il messaggio di aiuto. Ad esempio dicendo --[no-]foo
all'inizio. Ma quella parte viene generata automaticamente da elementi esterni alla classe Action
.
No. Il prefisso "no-" è altamente localizzata. Non è coerente in inglese ("un-" è anche abbastanza comune). –
Penso che tu debba scriverlo da solo. Vorrei averlo incorporato. – jterrace
@ S.Lott: È vero. Tuttavia, questo programma non avrà un pubblico globale. :-) E se questa possibilità fosse disponibile, mi aspetterei che il prefisso possa essere personalizzato in qualche modo. – Omnifarious