Estou usando argparse
no Python 2.7 para analisar as opções de entrada. Uma das minhas opções é de múltipla escolha. Quero fazer uma lista em seu texto de ajuda, por exemplo
from argparse import ArgumentParser
parser = ArgumentParser(description='test')
parser.add_argument('-g', choices=['a', 'b', 'g', 'd', 'e'], default='a',
help="Some option, where\n"
" a = alpha\n"
" b = beta\n"
" g = gamma\n"
" d = delta\n"
" e = epsilon")
parser.parse_args()
No entanto, argparse
retira todas as novas linhas e espaços consecutivos. O resultado parece
~ / Downloads: 52 $ python2.7 x.py -h uso: x.py [-h] [-g {a, b, g, d, e}] teste argumentos opcionais: -h, --help mostra esta mensagem de ajuda e sai -g {a, b, g, d, e} Alguma opção, onde a = alfa b = beta g = gama d = delta e = epsilon
Como inserir novas linhas no texto de ajuda?
argparse
, não pelo intérprete, portanto, mudar para"""..."""
não ajuda.Respostas:
Tente usar
RawTextHelpFormatter
:fonte
Only the name of this class is considered a public API. All the methods provided by the class are considered an implementation detail.
provavelmente não é uma ótima idéia, embora possa não importar, pois 2,7 deve ser o último python 2.x e você deverá refatorar muitas coisas para 3.x de qualquer maneira. Na verdade, estou executando o 2.6 comargparse
instalado viaeasy_install
para que a documentação possa estar desatualizada.RawDescriptionHelpFormatter
que funciona apenas na descrição e no epilog, em vez de no texto de ajuda.RawTextHelpFormatter
novas linhas iniciais e finais são removidas. Para contornar isso, você pode simplesmente adicionar duas ou mais novas linhas consecutivas; todos, exceto uma nova linha, sobreviverão.class Formatter( argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter): pass
e depoisformatter_class=Formatter
.Se você deseja substituir apenas uma opção, não deve usar
RawTextHelpFormatter
. Em vez disso, subclasseHelpFormatter
e forneça uma introdução especial para as opções que devem ser tratadas como "brutas" (eu uso"R|rest of help"
):E use-o:
Quaisquer outras chamadas para as
.add_argument()
quais a ajuda não começaR|
serão encerradas normalmente.Isso faz parte das minhas melhorias no argparse . O SmartFormatter completo também suporta a adição dos padrões a todas as opções e a entrada bruta da descrição dos utilitários. A versão completa possui seu próprio
_split_lines
método, de forma que qualquer formatação feita para, por exemplo, seqüências de caracteres de versão seja preservada:fonte
parser.add_argument('-v', '--version', action='version',version=get_version_str())
É possível estendê-lo a esse caso?_split_lines
e preserva as quebras de linha (não há necessidade de especificar "R |" no início, se você quiser essa opção, corrigir o_VersionAction.__call__
método_VersionAction.__call__
que eu provavelmente gostaria que ele apenas emparser.exit(message=version)
vez de usar a versão formatada. Existe alguma maneira de fazer isso sem liberar uma cópia corrigida do argparse?__call__
em_VersionAction
fazendoargparse._VersionAction.__call__ = smart_version
depois de definirdef smart_version(self, parser, namespace, values, option_string=None): ...
Outra maneira fácil de fazer isso é incluir o pacote de texto .
Por exemplo,
Dessa forma, podemos evitar o longo espaço vazio na frente de cada linha de saída.
fonte
Eu já enfrentei um problema semelhante (Python 2.7.6). Eu tentei dividir a seção de descrição em várias linhas usando
RawTextHelpFormatter
:E pegou:
Então
RawTextHelpFormatter
não é uma solução. Porque ele imprime a descrição como aparece no código-fonte, preservando todos os caracteres de espaço em branco (quero manter guias extras no meu código-fonte para facilitar a leitura, mas não quero imprimi-los todos. O formatador bruto também não quebra a linha quando é muito longo, mais de 80 caracteres, por exemplo).Obrigado a @Anton, que inspirou a direção correta acima . Mas essa solução precisa de pequenas modificações para formatar a seção de descrição .
De qualquer forma, é necessário um formatador personalizado. Estendi a
HelpFormatter
classe existente e substituí o_fill_text
método como este:Compare com o código fonte original do módulo argparse :
No código original, toda a descrição está sendo quebrada. No formatador personalizado acima, o texto inteiro é dividido em vários blocos e cada um deles é formatado independentemente.
Assim, com a ajuda do formatador personalizado:
a saída é:
fonte
HelpFormatter
é problemática, pois os desenvolvedores do argparse garantem apenas que o nome da classe sobreviverá nas versões futuras do argparse. Basicamente, eles mesmos fizeram um cheque em branco para que pudessem alterar os nomes dos métodos, se assim fosse conveniente. Eu acho isso frustrante; o mínimo que eles poderiam ter feito é expor alguns métodos na API.Eu queria ter quebras de linha manuais no texto de descrição e quebra automática de código; mas nenhuma das sugestões aqui funcionou para mim - então acabei modificando a classe SmartFormatter fornecida nas respostas aqui; apesar dos problemas com os nomes dos métodos argparse que não são uma API pública, eis o que eu tenho (como um arquivo chamado
test.py
):É assim que funciona em 2.7 e 3.4:
fonte
A partir do SmartFomatter descrito acima, terminei com essa solução:
Observe que, estranhamente, o argumento formatter_class passado para o analisador de nível superior não é herdado por sub_parsers, é preciso passá-lo novamente para cada sub_parser criado.
fonte
Prefácio
Para esta pergunta,
argparse.RawTextHelpFormatter
é útil para mim.Agora, quero compartilhar como uso o
argparse
.Eu sei que pode não estar relacionado à pergunta,
mas essas perguntas me incomodam há um tempo.
Então, eu quero compartilhar minha experiência, espero que seja útil para alguém.
Aqui vamos nós.
Módulos de terceiros
colorama : para alterar a cor do texto:
pip install colorama
Exemplo
Onde a classe de
FormatText
é a seguintefonte