De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
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)
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários