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. : -)

Foi útil?

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 \ts 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top