Requerir cualquiera de los dos argumentos usando argparse

183

Dado:

import argparse

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

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

Cómo puedo

  • realizar al menos uno de "foo, bar" obligatorios: --foo x, --bar yy --foo x --bar yestán bien
  • hacer a lo sumo uno de "foo, bar" obligatorio: --foo xo --bar yestán bien, --foo x --bar yno es
georg
fuente

Respuestas:

297

Creo que está buscando algo como la exclusión mutua (al menos para la segunda parte de su pregunta).

De esta manera, solo se aceptarán foo o bar, no ambos.

    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()

Por cierto, acabo de encontrar otra pregunta que se refiere al mismo tipo de problema.

Espero que esto ayude

jlengrand
fuente
1
¡Nunca hubiera imaginado que fuera tan fácil! Te amo Python 3.6!
bjd2385
¿Quién es Christian Witts y dónde está su respuesta?
ijoseph
3
Hola @ijoseph, esta respuesta es bastante antigua por ahora. Ya no estoy seguro de cuál fue la respuesta. Probablemente ya se haya eliminado. ¡Lo siento por eso!
jlengrand
1
@jlengrand su respuesta aún funcionó para mí después de que me di cuenta de que en realidad resuelve ambas condiciones propuestas en la pregunta ( XOR, básicamente). Mi preocupación inicial era que la suya solo resolviera una de las dos condiciones.
ijoseph
Gracias por la respuesta. Tenía una idea de que estaba resolviendo todo, pero ya no estaba seguro: D. ¡Editaré la respuesta en consecuencia!
jlengrand
39

Si necesita alguna comprobación que no proporciona el módulo, siempre puede hacerlo manualmente:

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")
algo
fuente