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

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


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")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.