Cette question avait déjà de nombreuses réponses très positives et une réponse acceptée, mais jusqu'à présent, toutes étaient distraites par diverses façons d'exprimer le problème booléen et ont manqué un point crucial:
J'ai un script python qui peut recevoir zéro ou trois arguments de ligne de commande. (Soit il fonctionne avec le comportement par défaut, soit il a besoin des trois valeurs spécifiées)
Cette logique ne doit pas être la responsabilité de votre code en premier lieu , elle doit plutôt être gérée parargparse
module. Ne vous embêtez pas à écrire une instruction if complexe, préférez plutôt configurer votre analyseur d'arguments comme ceci:
#!/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)
Et oui, cela devrait être une option et non un argument positionnel, car après tout, il est facultatif .
édité: Pour répondre à la préoccupation de LarsH dans les commentaires, voici un exemple de la façon dont vous pourriez l'écrire si vous étiez certain de vouloir l'interface avec 3 ou 0arguments positionnels . Je suis d'avis que l'interface précédente est un meilleur style, car les arguments optionnels devraient être des options , mais voici une approche alternative par souci d'exhaustivité. Notez le kwarg de remplacementusage
lors de la création de votre analyseur, carargparse
sinon, cela générera automatiquement un message d'utilisation trompeur!
#!/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)
Voici quelques exemples d'utilisation:
# 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