Essa pergunta já tinha muitas respostas altamente votadas e uma resposta aceita, mas todas elas até agora foram distraídas por várias maneiras de expressar o problema booleano e perderam um ponto crucial:
Eu tenho um script python que pode receber zero ou três argumentos de linha de comando. (Ele é executado no comportamento padrão ou precisa dos três valores especificados)
Essa lógica não deve ser de responsabilidade do seu código em primeiro lugar , mas deve ser manipulada porargparse
módulo. Não se preocupe em escrever uma declaração if complexa, em vez disso, prefira configurar seu analisador de argumentos da seguinte forma:
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser()
parser.add_argument('--foo', nargs=3, default=['x', 'y', 'z'])
args = parser.parse_args()
print(args.foo)
E sim, deve ser uma opção, não um argumento posicional, porque afinal é opcional .
editado: Para abordar a preocupação de LarsH nos comentários, abaixo está um exemplo de como você pode escrevê-lo se tiver certeza de que deseja a interface com 3 ou 0argumentos posicionais . Sou da opinião de que a interface anterior tem um estilo melhor, porqueargumentos opcionais devem ser opções , mas aqui está uma abordagem alternativa por uma questão de integridade. Observe o kwarg sobrescritousage
ao criar seu analisador, pois,argparse
caso contrário,será gerada automaticamente uma mensagem de uso enganosa!
#!/usr/bin/env python
import argparse as ap
parser = ap.ArgumentParser(usage='%(prog)s [-h] [a b c]\n')
parser.add_argument('abc', nargs='*', help='specify 3 or 0 items', default=['x', 'y', 'z'])
args = parser.parse_args()
if len(args.abc) != 3:
parser.error('expected 3 arguments')
print(args.abc)
Aqui estão alguns exemplos de uso:
# default case
wim@wim-zenbook:/tmp$ ./three_or_none.py
['x', 'y', 'z']
# explicit case
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2 3
['1', '2', '3']
# example failure mode
wim@wim-zenbook:/tmp$ ./three_or_none.py 1 2
usage: three_or_none.py [-h] [a b c]
three_or_none.py: error: expected 3 arguments