Exiger l'un des deux arguments en utilisant argparse

183

Donné:

import argparse

pa = argparse.ArgumentParser()
pa.add_argument('--foo')
pa.add_argument('--bar')

print pa.parse_args('--foo 1'.split())

comment puis-je

  • faire au moins l' un des « foo, bar » obligatoire: --foo x, --bar yet --foo x --bar ysont très bien
  • rendre obligatoire au plus l'un des mots "foo, bar": --foo xou --bar yc'est bien, --foo x --bar yn'est pas
Georg
la source

Réponses:

297

Je pense que vous recherchez quelque chose comme l'exclusion mutuelle (au moins pour la deuxième partie de votre question).

De cette façon, seuls foo ou bar seront acceptés, pas les deux.

    import argparse

    parser = argparse.ArgumentParser()
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--foo',action=.....)
    group.add_argument('--bar',action=.....)
    args = parser.parse_args()

BTW, vient de trouver une autre question faisant référence au même type de problème.

J'espère que cela t'aides

Jlengrand
la source
1
Je n'aurais jamais deviné que c'était si facile! Je t'aime Python 3.6!
bjd2385
Qui est Christian Witts et où est sa réponse?
ijoseph
3
HEy @ijoseph, cette réponse est assez ancienne maintenant. Je ne sais plus quelle était la réponse. Il a probablement été supprimé maintenant. Désolé!
jlengrand
1
@jlengrand votre réponse fonctionnait toujours pour moi après avoir réalisé qu'elle résout en fait les deux conditions proposées dans la question ( XOR, en gros). Ma préoccupation initiale était que la vôtre ne résolvait qu'une seule des deux conditions.
ijoseph
Merci pour les commentaires. J'avais une idée que cela résolvait tout, mais je n'étais plus sûr: D. Je modifierai la réponse en conséquence!
jlengrand
39

Si vous avez besoin d'une vérification qui n'est pas fournie par le module, vous pouvez toujours le faire manuellement:

pa = argparse.ArgumentParser()
...
args = pa.parse_args()

if args.foo is None and args.bar is None:
   pa.error("at least one of --foo and --bar required")
qc
la source