você está aqui: Home  → Arquivo de Mensagens

Parâmetros em scripts python de forma fácil

Colaboração: Islan Rocha

Data de Publicação: 15 de outubro de 2012

Você que já necessitou criar scripts que suportem um número razoável de parâmetros sabe o quanto é chato fazer as checagens iniciais pra evitar que a lógica do seu script caia por terra. Estou falando de checagens de quais parâmetros são obrigatórios, quais são opcionais, quais são parâmetros nomeados, etc.

Esta dica vai para os que, assim como eu, odeiam reinventar a roda.

Trata-se de um projeto fenomenal, chamado docopt.

Resumidamente, ele permite vc criar scripts que aceitem parâmetros no padrão POSIX de forma simples e clara.

O projeto inicial resolvia este problema para scripts em python por isso, acredito eu, o nome docopt (doc - opt). "doc", pois a docstring, definida no início do script, é transformada nas opções "opt" suportadas. Maravilhoso isso.

Pra exemplificar o que estou dizendo, segue um dos códigos de exemplo do próprio projeto e o resultado de uma execução com alguns parâmetros passados.

  #!/usr/bin/python
  """Naval Fate.
  
  Usage:
   naval_fate.py ship new < name>...
   naval_fate.py ship < name> move < x> < y> [--speed=< kn>]
   naval_fate.py ship shoot < x> < y>
   naval_fate.py mine (set|remove) < x> < y> [--moored|--drifting]
   naval_fate.py -h | --help
   naval_fate.py --version
  
  Options:
   -h --help     Show this screen.
   --version     Show version.
   --speed=< kn>  Speed in knots [default: 10].
   --moored      Moored (anchored) mine.
   --drifting    Drifting mine.
  """
  
  from docopt import docopt
  
  if __name__ == '__main__':
     arguments = docopt(__doc__, version='Naval Fate 2.0')
     print(arguments)

Resultado da execução deste código:

  islan@tsunami ~$ ./teste.py ship new teste
  {'--drifting': False,
  '--help': False,
  '--moored': False,
  '--speed': '10',
  '--version': False,
  '< name>': ['teste'],
  '< x>': None,
  '< y>': None,
  'mine': False,
  'move': False,
  'new': True,
  'remove': False,
  'set': False,
  'ship': True,
  'shoot': False}
  islan@tsunami ~$

Imaginaram como o restante das checagens e tratamentos ficam muito mais fáceis de se de fazer de posse de um dicionário com tudo já "parseado"?

Os amantes do bash não precisam ficar tristes, podem utilizar a versão criada como referência para a implementação em python. Neste momento há também versões para php, javascript, ruby.

Enjoy!

Islan Rocha é bacharel em Ciência da Computação, pós-graduado em Administração de Redes Linux pela Universidade Federal de Lavras. Usuário Linux e disseminador da cultura open source desde 2003. (http://islan.pro)



 

 

Veja a relação completa dos artigos de Islan Rocha

Opinião dos Leitores

Matheus
25 Out 2012, 21:32
eu costumo usar o argparse
a aprendizagem eh um pouco complicada
mas existem bastante recursos
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script