Como faço para formatar posicional ajuda argumento usando optparse do Python?
-
22-07-2019 - |
Pergunta
Conforme mencionado na os docs o optparse.OptionParser
usa um IndentedHelpFormatter
para a saída a ajuda opção formatado, para a qual que eu achei alguns documentação da API .
eu quero mostrar um texto de ajuda semelhante formatado para os requeridos, argumentos posicionais no texto de uso. Existe um um padrão de uso simples adaptador ou que pode ser usado para o argumento de posição semelhante formatação?
Clarificação
De preferência usando apenas o stdlib. Optparse faz grande, exceto para esta nuance formatação, o que eu sinto que deve ser capaz de correção sem importar inteiras outros pacotes. : -)
Solução
A melhor aposta seria escrever um patch para o módulo optparse. Enquanto isso, você pode fazer isso com uma classe OptionParser ligeiramente modificada. Esta não é perfeito, mas vai conseguir o que deseja fazer.
#!/usr/bin/env python
from optparse import OptionParser, Option, IndentedHelpFormatter
class PosOptionParser(OptionParser):
def format_help(self, formatter=None):
class Positional(object):
def __init__(self, args):
self.option_groups = []
self.option_list = args
positional = Positional(self.positional)
formatter = IndentedHelpFormatter()
formatter.store_option_strings(positional)
output = ['\n', formatter.format_heading("Positional Arguments")]
formatter.indent()
pos_help = [formatter.format_option(opt) for opt in self.positional]
pos_help = [line.replace('--','') for line in pos_help]
output += pos_help
return OptionParser.format_help(self, formatter) + ''.join(output)
def add_positional_argument(self, option):
try:
args = self.positional
except AttributeError:
args = []
args.append(option)
self.positional = args
def set_out(self, out):
self.out = out
def main():
usage = "usage: %prog [options] bar baz"
parser = PosOptionParser(usage)
parser.add_option('-f', '--foo', dest='foo',
help='Enable foo')
parser.add_positional_argument(Option('--bar', action='store_true',
help='The bar positional argument'))
parser.add_positional_argument(Option('--baz', action='store_true',
help='The baz positional argument'))
(options, args) = parser.parse_args()
if len(args) != 2:
parser.error("incorrect number of arguments")
pass
if __name__ == '__main__':
main()
E a saída que você tem de correr isto:
Usage: test.py [options] bar baz
Options:
-h, --help show this help message and exit
-f FOO, --foo=FOO Enable foo
Positional Arguments:
bar The bar positional argument
baz The baz positional argument
Outras dicas
Tente dar uma olhada em argparse . Documentação diz que suporta argumentos de posição e mais bonito mensagens de ajuda.
Eu estaria interessado em uma solução limpa para isso; Eu não era capaz de chegar a um. O OptionParser realmente concentra-se inteiramente nas opções; ele não lhe dá qualquer coisa para trabalhar com os argumentos de posição, tanto quanto eu tenho sido capaz de encontrar.
O que fiz foi para gerar uma lista de pequenos blocos de documentação para cada um dos meus argumentos posicionais, usando \t
s para obter o espaçamento certo. Então me juntei a eles com novas linhas, e acrescentado que a string 'uso' que é passada para o OptionParser.
Ele parece bem, mas parece bobagem, e é claro que a documentação acaba aparecendo acima da lista de opções. Eu não encontrei nenhuma maneira de contornar isso, ou como fazer qualquer coisa complexa, ou seja, um determinado conjunto de opções é descrito abaixo a descrição de um arg posicional, porque eles só se aplicam a esse arg.
Eu olhei para os métodos de OptionParser-remendar macaco e eu me lembro (este foi um ano ou mais atrás), que não teria sido tão difícil, mas eu não quero ir por esse caminho.
A maioria texto de ajuda para argumentos posicionais se assemelha ao formato freqüentemente usada em páginas de manual para caixas * NIX. Dê uma olhada na como o comando 'cp' está documentado . Seu texto de ajuda deve se parecer com isso.
Caso contrário, desde que você preencha o argumento de "ajuda" ao usar o analisador, a documentação deve produzir em si.