Questa domanda aveva già molte risposte molto apprezzate e una risposta accettata, ma finora tutte sono state distratte da vari modi di esprimere il problema booleano e hanno perso un punto cruciale:
Ho uno script Python che può ricevere zero o tre argomenti della riga di comando. (Funziona in base al comportamento predefinito o richiede tutti e tre i valori specificati)
Questa logica non dovrebbe essere la responsabilità del tuo codice in primo luogo , piuttosto dovrebbe essere gestito dalargparsemodulo. Non preoccuparti di scrivere un'istruzione if complessa, preferisci invece impostare il tuo parser di argomenti in questo modo:
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
E sì, dovrebbe essere un'opzione non un argomento posizionale, perché dopo tutto è facoltativo .
modificato: per rispondere alle preoccupazioni di LarsH nei commenti, di seguito è riportato un esempio di come potresti scriverlo se fossi certo di volere l'interfaccia con 3 o 0argomenti posizionali . Sono dell'opinione che l'interfaccia precedente abbia uno stile migliore, perché gliargomenti opzionali dovrebbero essere opzioni , ma ecco un approccio alternativo per completezza. Nota la sostituzione di kwargusagedurante la creazione del tuo parser, perchéargparsealtrimenti genererà automaticamente un messaggio di utilizzo fuorviante!
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
Ecco alcuni esempi di utilizzo:
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments