Exigir um dos dois 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())

como é que eu

  • fazer pelo menos um dos "foo, bar" obrigatória: --foo x, --bar ye --foo x --bar yestão bem
  • tornar no máximo um de "foo, bar" obrigatório: --foo xou --bar yestá bom, --foo x --bar ynão é
georg
fonte

Respostas:

297

Acho que você está procurando algo como exclusão mútua (pelo menos na segunda parte da sua pergunta).

Dessa forma, somente foo ou bar serão aceitos, não os dois.

    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, acabei de encontrar outra pergunta referente ao mesmo tipo de problema.

Espero que isto ajude

jlengrand
fonte
1
Eu nunca teria imaginado que era tão fácil! Te amo Python 3.6!
precisa saber é o seguinte
Quem é Christian Witts e onde está sua resposta?
ijoseph
3
Hey @ jooseph, esta resposta já está antiga. Não tenho mais certeza de qual foi a resposta. Provavelmente já foi removido até agora. Desculpe por isso!
precisa saber é o seguinte
1
@jlengrand sua resposta ainda funcionou para mim depois que percebi que realmente resolve as duas condições propostas na pergunta ( XORbasicamente). Minha preocupação inicial era que a sua só resolvesse apenas uma das duas condições.
precisa saber é
Obrigado pelo feedback. Eu tinha uma ideia de que estava resolvendo tudo, mas não tinha mais certeza: D. Vou editar a resposta de acordo!
precisa saber é o seguinte
39

Se você precisar de alguma verificação que não seja fornecida pelo módulo, sempre poderá fazê-lo 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")
sth
fonte