Tratando argumentos com argparse

No post anterior, vimos o que são e como tratar manualmente os argumentos vindos para o programa pela linha de comando do usuário. Como vimos, é trabalhoso e chato tratar todas as possíveis opções de nosso programa. Para facilitar nossa vida, existem várias bibliotecas para tratamento dessas opções. Em Python, temos algumas opções, e no post de hoje iremos ver um pouco do módulo argparse. Basta informarmos a ele quais são os argumentos esperados para nosso programa, que o trabalho de realizar a verificação e atribuição de entradas à variáveis internas é feito pelo código do argparse. Além disso, o argparse gera automaticamente o texto de ajuda e o apresenta quando o usuário passa argumentos incorretos.

Para exemplificar, vamos escrever um programa simples que recebe como argumentos dois valores, identificados por opções, da seguinte forma:

$ prog.py --frase "ola mundo" -n 10

O programa então imprime na tela a frase recebida como entrada n vezes.

Em primero lugar, importamos o módulo argparse e instanciamos um objeto ArgumentParser, que será o responsável por fazer a análise dos argumentos fornecidos pela linha de comando.

1: import argparse
2:  parser = argparse.ArgumentParser(description = 'Um programa de exemplo.')

Após isso, devemos configurar nosso parser, informando a ele quais são os argumentos esperados pelo nosso programa.

3:  parser.add_argument('--frase', action = 'store', dest = 'frase',
                           default = 'Hello, world!', required = False,
                           help = 'A frase que deseja imprimir n vezes.')
4:  parser.add_argument('-n', action = 'store', dest = 'n', required = True,
                           help = 'O número de vezes que a frase será impressa.')

A linha 3 cria o argumento –frase (cujo valor será passado como argumento seguinte), sendo que a ação a ser tomada pelo argparse ao encontrar tal argumento será armazenar (action = ‘store’) o valor fornecido em uma variável interna do programa referenciada pelo nome frase (dest = ‘frase’). Tal argumento é opcional (required = False) e, caso o usuário não forneça ele, o valor padrão será ‘Hello, world!’. Caso o usuário solicite ajuda do programa (através do atributo padrão -h), será mostrado um texto que inclui a informação sobre o argumento –frase. O mesmo foi feito para o argumento -n, com a diferença de que este é um argumento obrigatório.

Após configurá-lo, devemos solicitar ao nosso parser para que faça a verificação dos argumentos.

5:  arguments = parser.parse_args()

A linha 5 mostra a chamada ao parser para que este faça a verificação dos argumentos. Como resultado, ele nos devolve um objeto (do tipo Namespace), que irá conter variáveis internas com os valores fornecidos pelo usuário pela linha de comando para os argumentos. Vejamos a sequência do programa:

6: for i in range(0, int(arguments.n)):
7:      print arguments.frase

Como podemos ver, os valores passados pelo usuário para frase e para n são acessados como atributos do objeto arguments. Pronto, temos um programinha bem simples que recebe argumentos pela linha de comando sem a necessidade de realizar o tratamento manual dos argumentos. Vamos ver a execução desse programa, que chamei de exemplo.py:

$ exemplo.py
usage: exemplo.py [-h] [--frase FRASE] -n N
exemplo.py: error: argument -n is required
$ exemplo.py --frase "olá"
usage: exemplo.py [-h] [--frase FRASE] -n N
exemplo.py: error: argument -n is required
$ exemplo.py --frase "olá" -n 3
olá
olá
olá

E, para finalizar, vamos ver o comportamento do programa quando o usuário fornece o argumento -h. Por padrão, o argparse monta um texto de ajuda, com base nas informações fornecidas na construção do parser.

 
$ exemplo.py -h
usage: exemplo.py [-h] [--frase FRASE] -n N

Um programa de exemplo.

optional arguments:
  -h, --help     show this help message and exit
  --frase FRASE  A frase que deseja imprimir n vezes.
  -n N           O número de vezes que a frase será impressa.

Além do argparse, o getopts também é um módulo muito utilizado para tratamento de opções de linha de comando. É isso, com módulos como esse, nossa vida fica muito mais fácil. 🙂

3 comentários sobre “Tratando argumentos com argparse

  1. Opa valeu por este belo post,mais na primeira frase ele me retorna o seguinte erro:
    Traceback (most recent call last):
    File “C:\Users\User\Desktop\argparse.py”, line 1, in
    import argparse
    File “C:\Users\User\Desktop\argparse.py”, line 2, in
    parser = argparse.ArgumentParser(description = ‘Um programa de exemplo!’)
    AttributeError: ‘module’ object has no attribute ‘ArgumentParser’
    Estou usando o Python 2.7

    • Arthur, o problema é que você nomeou o arquivo do seu programa com o mesmo nome do módulo (argparse.py). Isso é um problema porque quando você faz:

      import argparse

      O interpretador encontra um módulo argparse.py no diretório atual e importa ele, usando assim um módulo incorreto. Ou seja, o seu programa importa a si próprio. Altere o nome do arquivo que contém o seu programa que o problema será resolvido.

      Tenha sempre cuidado para não nomear seus arquivos com o nome de outros módulos já existentes.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s