Ho uno script in cui chiedo all'utente un elenco di azioni predefinite da eseguire. Voglio anche la possibilità di assumere un elenco particolare di azioni quando l'utente non definisce nulla. tuttavia, sembra che provare a fare entrambe queste cose sia impossibile.python argparse - argomento append opzionale con scelte
quando l'utente dà nessun argomento, ricevono un errore che la scelta di default è valido
acts = ['clear','copy','dump','lock']
p = argparse.ArgumentParser()
p.add_argument('action', nargs='*', action='append', choices=acts, default=[['dump', 'clear']])
args = p.parse_args([])
>>> usage: [-h] [{clear,copy,dump,lock} [{clear,copy,dump,lock} ...]]
: error: argument action: invalid choice: [['dump', 'clear']] (choose from 'clear', 'copy', 'dump', 'lock')
e quando lo fanno definire una serie di azioni, lo spazio dei nomi risultante ha le azioni dell'utente aggiunti al valore predefinito, invece di sostituire il default
acts = ['clear','copy','dump','lock']
p = argparse.ArgumentParser()
p.add_argument('action', nargs='*', action='append', choices=acts, default=[['dump', 'clear']])
args = p.parse_args(['lock'])
args
>>> Namespace(action=[['dump', 'clear'], ['dump']])
Non sono sicuro che questo problema sia stato risolto da un bug simile: http://bugs.python.org/issue9625. Un modo possibile per gestirlo è usare un'azione personalizzata, piuttosto che la parola chiave 'choices'. Vedi la risposta accettata su [questa domanda] (http://stackoverflow.com/questions/4194948/python-argparse-is-there-a--to-specify-a-range-in-nargs) – Chris