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 é

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


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")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.