Ajuda para validar argumentos com argparse

203 views
Skip to first unread message

Raphael Rabelo

unread,
Jun 3, 2013, 12:05:29 PM6/3/13
to python...@googlegroups.com
Boa tarde amigos, 

Sou novo na lista e estou inciando com python agora, estou a cerca de umas 3 semanas mexendo todos os dias afim de aprimorar meus conhecimentos nessa linguagem.

A única base que tenho é shell script, nunca programei em nenhuma outra linguagem, uso script para facilitar meu dia a dia, e estou querendo migrar para o python por já possuir diversas funções que facilitariam alguma tarefas (uso das listas, por exemplo :-)

Pois bem, estou criando um script para fazer deploy de arquivos em meu ambientes web, porém estou com algumas dúvidas para validar os argumentos com argparse.

Comecei a aprender python utilizando o site "Python: The hard way" e tomei isso como base pra criar o script.


As opções seriam:

-e = Define os ambientes que serão aplicados, junto isso depois com uso do fabfile.py usando fabric...

-f = define o arquivo (.tar) contendo os arquivos a serem subtituidos no destino

-l = define uma lista, que contem o caminho dos arquivos .tar que serão aplicados. Ex.

/home/packs/file1.tar
/home/packs/file2.tar
/home/packs/file3.tar
 Etc ...

-b = Faz backup da pasta destino. Ainda não desenvolvi...
-u = Faz dump da base especificada. Ainda não desenvolvi ...

Os únicos argumentos obrigatórios seriam -e + -f OU -l
Fiz uma gambiarra aqui pra poder validar os parametros, mas gostaria de saber se existe uma solução mais "elegante" de se fazer isso, no meu script a partir da linha 68.

Agradeço desde já a atenção de todos.

Um abraço!
Raphael Rabelo de Oliveira
(11) 96105-8257
 Pense antes de imprimir este e-mail.

Alex

unread,
Jun 3, 2013, 5:54:23 PM6/3/13
to python...@googlegroups.com
Defina validar parâmetros.

Tudo o que o módulo argparse faz, como descrito abaixo

é tranforma sys.argv, que é uma lista bruta de strings,

em tipos de dados do Python. O que quero dizer com isso, é que se você espera que um usuário entre
com um número inteiro, na linha de comandos, em sys.argv ele não passará de uma string, por exemplo "1",
mas com argparse é possível transformá-lo em inteiro e utilizá-do livremente.

Portanto argparse já faz todo o trabalho de conversão de tipos(claro que você deve configurar os tipos que deseja receber).

Mas olhando o código que você forneceu parece que sua validação faz referência a outro coisa, supondo que você queira receber uma lista com parâmetro.

if lista != []: # isso também é uma validação, pois você quer saber se algum parâmetro foi dado.
Ou
if len(lista) > 0 # outro modo, de validação, mas acho que seja melhor que a primeira

if condicao == True # outra validação, mas não passa de controle de fluxo, com os argumentos tratados por argparse
Ou
if condicao is True:
if condicao is not False:
if not condicao is False:

Acho que, na sua pergunta, o segundo caso se aplica melhor.

Raphael Rabelo

unread,
Jun 4, 2013, 11:28:23 AM6/4/13
to python...@googlegroups.com
Em 3 de junho de 2013 18:54, Alex <genio...@gmail.com> escreveu:
Defina validar parâmetros.

Alex, quando eu digo parâmetros, é para expressar todos os argumentos passados ao script via linha de comando, como citei:
As opções seriam:

-e = Define os ambientes que serão aplicados, junto isso depois com uso do fabfile.py usando fabric...
-f = define o arquivo (.tar) contendo os arquivos a serem subtituidos no destino
-l = define uma lista, que contem o caminho dos arquivos .tar que serão aplicados.
-b = Faz backup da pasta destino. Ainda não desenvolvi...
-u = Faz dump da base especificada. Ainda não desenvolvi ...
Tudo o que o módulo argparse faz, como descrito abaixo

é tranforma sys.argv, que é uma lista bruta de strings,

em tipos de dados do Python. O que quero dizer com isso, é que se você espera que um usuário entre
com um número inteiro, na linha de comandos, em sys.argv ele não passará de uma string, por exemplo "1",
mas com argparse é possível transformá-lo em inteiro e utilizá-do livremente.

Portanto argparse já faz todo o trabalho de conversão de tipos(claro que você deve configurar os tipos que deseja receber).
 
No meu caso eu não desejo fazer nenhum tipo de conversão, pelo menos por enquanto, quando eu digo "ajuda para validar os parâmentros" me refiro a esta parte do código:

# Verifica se foi ou não colocado na chamada do script o parâmetro -b e/ou -u, e chama as funções fnBackup() e fnDump, respectivamente...
if args.backup == False:
fnBackup()
if args.dump == False:
fnDump()

# Verifica de foi ou não colocado na chamada do script o "parâmetro" -f, caso positivo (!= None) ele testa se o arquivo é um arquivo .tar e executa o os.system
if args.file != None:
if tarfile.is_tarfile(args.file[0]):
if fnExtFile(args.file[0]) == True:
for i in env:
os.system('fab -R %s_web deploy' % i)
exit(0)
else:
print "ERROR"
exit(1)
else:
pass

if args.list != None:
if fnExtList(args.list) == True:
for i in env:
os.system('fab -R %s_web deploy' % i)
else:
exit(1)
else:
pass



Mas olhando o código que você forneceu parece que sua validação faz referência a outro coisa, supondo que você queira receber uma lista com parâmetro.

if lista != []: # isso também é uma validação, pois você quer saber se algum parâmetro foi dado.
Ou
if len(lista) > 0 # outro modo, de validação, mas acho que seja melhor que a primeira

if condicao == True # outra validação, mas não passa de controle de fluxo, com os argumentos tratados por argparse
Ou
if condicao is True:
if condicao is not False:
if not condicao is False:

Acho que, na sua pergunta, o segundo caso se aplica melhor.

Um exemplo de uso do script seria:

# python deployer.py -e desenv homolog -b -u -f arquivo.tar
e
# python deployer -e prod -b -u -l lista.txt

No primeiro exemplo, o script deverá chamar as funções fnBackup() (-b), fnDump() (-u) e fnExtFile(arq) (-f arquivo.tar)
Para definição dos ambientes, estou usando o fabric (https://github.com/rabeloo/scripts/blob/master/python/deployer/fabfile.py)
Mas não estou conseguindo chamar o fabric para executar os comandos dentro do script (sem utilizar o os.system)

Mais uma vez, estou começando com Python, minha base é shell script e o que sei de python é o que leio na internet, por isso ainda não assimilei todos os termos, e com isso meu texto pode acabar confundindo :/

Obrigado pela ajuda!
Um abraço!


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Raphael Rabelo

unread,
Jun 4, 2013, 11:29:37 AM6/4/13
to python...@googlegroups.com
Em 4 de junho de 2013 07:41, Alex Chiaranda <aech...@gmail.com> escreveu:
Raphael,

da uma olhada no docopt, talvez te ajude


Att.
 
Alex

Alex, parece bem interessante! Vou dar uma olhada!
Obrigado!
Abs
Raphael 
--
Reply all
Reply to author
Forward
0 new messages