Por que usar argparse em vez de optparse?

290

Notei que a documentação do Python 2.7 inclui mais um módulo de análise de linha de comando. Além getopte optparseagora temos argparse.

Por que outro módulo de análise de linha de comando foi criado? Por que devo usá-lo em vez de optparse? Existem novos recursos que eu deveria conhecer?

fmark
fonte
8
Ou talvez não use nenhuma porque, desde 2012, o Python possui um módulo fácil, poderoso e muito interessante para a análise de argumentos, chamado docopt. docopt.org
ndemou 22/09/14
1
tente clicar nele e envolver o optparse.
Amit Tripathi

Respostas:

324

A partir do python 2.7, optparseestá obsoleta e esperamos que desapareça no futuro.

argparseé melhor por todos os motivos listados em sua página original ( https://code.google.com/archive/p/argparse/ ):

  • manipulação de argumentos posicionais
  • subcomandos de suporte
  • permitindo prefixos de opções alternativas como +e/
  • manipulação de argumentos de estilo zero ou mais e um ou mais
  • produzindo mensagens de uso mais informativas
  • fornecendo uma interface muito mais simples para tipos e ações personalizados

Mais informações também estão no PEP 389 , que é o veículo pelo qual argparseentrou na biblioteca padrão.

Nicholas Knight
fonte
18
Uma interface muito mais simples para tipos personalizados ... mas uma interface mais complexa em geral. Eu realmente me pergunto por que até mudei para optparse, porque o drumroll getopt permanecerá . Sim, sem depreciação para esse dinossauro. Sheeesh.
Jürgen A. Erhard,
4
A menção à "pureza" de optparseno PEP argumenta mais tarde sobre o quão complexo é adicionar e parecer que foi codificado para ser tão flexível quanto o rock (mal).
Nick T
1
A interface dos subcomandos é ruim. A saída padrão não é útil e a alteração é difícil.
Anatoly techtonik
Observe que o code.google.com continuará em manutenção em alguns dias. Diferenças com mais detalhes estão disponíveis aqui: argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Jean-François T.
63

Por que devo usá-lo em vez de optar pela opção? São os novos recursos que devo conhecer?

A resposta de @ Nicholas cobre isso bem, eu acho, mas não a pergunta mais "meta" que você começa:

Por que outro módulo de análise de linha de comando foi criado?

Esse é o dilema número um quando qualquer módulo útil é adicionado à biblioteca padrão: o que você faz quando surge uma maneira substancialmente melhor, mas incompatível com versões anteriores, de fornecer o mesmo tipo de funcionalidade?

Ou você segue o caminho antigo e reconhecidamente superado (normalmente quando estamos falando de pacotes complicados: asyncore vs twisted, tkinter vs wx ou Qt, ...) ou você acaba com várias maneiras incompatíveis de fazer a mesma coisa (XML analisadores, IMHO, são um exemplo ainda melhor do que analisadores de linha de comando - mas o emailpacote versus as inúmeras maneiras antigas de lidar com problemas semelhantes também não está muito longe ;-).

Você pode fazer resmungos ameaçadores nos documentos sobre os modos antigos serem "descontinuados", mas (contanto que você precise manter a compatibilidade com versões anteriores), você realmente não pode tirá-los sem impedir que aplicativos grandes e importantes migrem para versões mais recentes do Python.

(O dilema número dois, não diretamente relacionado à sua pergunta, está resumido no velho ditado "a biblioteca padrão é onde bons pacotes morrem" ... com lançamentos a cada ano e meio, pacotes que não são muito, muito estável, sem precisar de lançamentos com mais frequência do que isso, pode sofrer bastante por ser "congelado" na biblioteca padrão ... mas isso é realmente uma questão diferente).

Alex Martelli
fonte
É certo que você pode incluir argparse.py para instalações python anteriores à 2.7 e não se preocupar com alterações incompatíveis com versões anteriores. Coisa extra para acompanhar, mas ele ainda é mantido fora da biblioteca padrão em argparse.googlecode.com
Ehtesh Choudhury
2
Argparse é substancialmente melhor apenas para alguns usos (nicho?). Não é realmente melhor em termos absolutos, é diferente . Ele pode fazer as coisas que a opção não pode, mas também possui regressões. Um exemplo que encontrei: optparse manipulou "-" por padrão (não tenho certeza de que ele fez o que é suposto fazer), enquanto o argparse não sabe nada sobre isso.
Jürgen A. Erhard
Para quem chega atrasado ao comentário acima, argparse definiu o prefixo e o nome, e a maioria dos analisadores é escrita como parser.add_argument('--long-opt', '-l',...); '-' é tratado com facilidade e da maneira que você quiser.
SilverbackNet
18

Há também crianças novas no quarteirão!

  • Além do optparse obsoleto já mencionado . [NÃO USE]
  • argparse também foi mencionado, que é uma solução para pessoas que não incluir bibliotecas externas.
  • O docopt é uma biblioteca externa que vale a pena examinar, que usa uma string de documentação como o analisador para sua entrada.
  • click também é uma lib externa e usa decoradores para definir argumentos. (Minha fonte recomenda: Por que clicar )
  • python-inquirer Para ferramentas de seleção focada e com base em Inquirer.js ( repo )

Se você precisar de uma comparação mais aprofundada, leia isso e poderá usar o docopt ou clicar em . Graças a Kyle Purdon!

lony
fonte
4
Embora este seja um comentário que vale a pena, ainda é um comentário mais do que uma resposta .. não há voto negativo, mas não voto positivo para mim também! Expandir a sua resposta com um resumo valioso do artigo para torná-lo em uma resposta real !: meta.stackexchange.com/a/8259/172394
Stefano
1
Tentei incluir um resumo do meu link, espero que agora valha uma boa resposta de stackoverflow.
Lony
6

No começo, fiquei tão relutante quanto o @fmark em mudar de optparse para argparse, porque:

  1. Eu pensei que a diferença não era tão grande.
  2. Alguns VPS ainda fornecem o Python 2.6 por padrão.

Então eu vi esse documento, argparse supera o optparse, especialmente quando se trata de gerar mensagens de ajuda significativas: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

E então vi " argparse vs. optparse " do @Nicholas, dizendo que podemos ter o argparse disponível em python <2.7 (Sim, eu não sabia disso antes).

Agora minhas duas preocupações estão bem abordadas. Escrevi isso esperando que ajude outras pessoas com uma mentalidade semelhante.

RayLuo
fonte