Eu uso o seguinte código simples para analisar alguns argumentos; note que um deles é necessário. Infelizmente, quando o usuário executa o script sem fornecer o argumento, o texto de uso / ajuda exibido não indica que existe um argumento não opcional, que eu acho muito confuso. Como posso obter python para indicar que um argumento não é opcional?
Aqui está o código:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Foo')
parser.add_argument('-i','--input', help='Input file name', required=True)
parser.add_argument('-o','--output', help='Output file name', default="stdout")
args = parser.parse_args()
print ("Input file: %s" % args.input )
print ("Output file: %s" % args.output )
Ao executar o código acima sem fornecer o argumento necessário, obtenho a seguinte saída:
usage: foo.py [-h] -i INPUT [-o OUTPUT]
Foo
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input file name
-o OUTPUT, --output OUTPUT
Output file name
-i INPUT
peça não é cercada por colchetes, que sutileza indica que é realmente necessário. Além disso, você pode explicar manualmente que através dohelp
paramoptional arguments
para os argumentos necessários ainda é enganoso.Respostas:
Os parâmetros que começam com
-
ou--
são geralmente considerados opcionais. Todos os outros parâmetros são parâmetros posicionais e, como tal, exigidos pelo design (como argumentos da função posicional). É possível exigir argumentos opcionais, mas isso é um pouco contra o design deles. Como eles ainda fazem parte dos argumentos não posicionais, eles ainda serão listados no cabeçalho confuso "argumentos opcionais", mesmo que sejam necessários. Os colchetes ausentes na parte de uso, no entanto, mostram que eles são realmente necessários.Veja também a documentação :
Dito isto, os cabeçalhos “argumentos posicionais” e “argumentos opcionais” na ajuda são gerados por dois grupos de argumentos nos quais os argumentos são automaticamente separados. Agora, você pode "invadir" e alterar o nome dos opcionais, mas uma solução muito mais elegante seria criar outro grupo para "argumentos nomeados obrigatórios" (ou o que você quiser chamá-los):
fonte
parser.parse_args([])
vez disso, useparser.parse_args()
sem argumentos para capturar o conteúdo de sys.argv. Por argparseComo eu prefiro listar os argumentos obrigatórios antes do opcional, eu os pego através de:
e isso gera:
Eu posso viver sem 'ajuda' aparecendo no grupo de argumentos opcionais.
fonte
Construindo fora de @Karl Rosaen
e isso gera:
fonte
_action_group
sem acessar o membro protegido? No meu caso, preciso adicionar algum argumento ao grupo (personalizado) já existente.Mais uma vez, aproveitando o @RalphyZ
Este não quebra a API exposta.
Que mostrará o mesmo que acima e deve sobreviver a versões futuras:
fonte
_action_groups
destina-se apenas a uso interno. Portanto, não há garantia de compatibilidade entre as versões.