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

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


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")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.