2012-06-22 10 views
98

dado:Exigir a cualquiera de los dos argumentos usando argparse

import argparse 

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

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

cómo hacer yo

  • hacer al menos una de "foo, bar" obligatorios: --foo x, --bar y y --foo x --bar y son bien
  • hacer como máximo uno de "foo, bar" obligatorio: --foo x o --bar y están bien, --foo x --bar y no es
+0

posible duplicado de [cómo codificar opciones combinacionales argparse en Python] (http://stackoverflow.com/questions/5603364/how-to-code-argparse-combinational-options-in-python) – robert

Respuesta

152

Creo que está buscando algo como mutual exclusion (al menos para la segunda parte de su pregunta). De esta manera, solo se aceptarán foo o barra, no ambos.

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

Y de hecho puede resolver la primera parte de la pregunta con la respuesta de Christian Witts. Al combinar ambos, debería ser capaz de lograr lo que desea.

Por cierto, acabo de encontrar another question haciendo referencia al mismo tipo de problema.

Esperanza esto ayuda

+0

¡Nunca hubiera adivinado que fuera tan fácil! Te amo Python 3.6! – bjd2385

20

Si necesita algún tipo de control que no es proporcionado por el módulo siempre se puede hacer de forma manual:

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") 
Cuestiones relacionadas