Percebeu alguma mudança? Veja o porquê.
Este é o Jornal do Jerimum, um blog mantido por Allan Garcia, sócio e administrador da ADG Soluções. Neste blog tratamos de assuntos relacionados com Tecnologia, Linux, Redes, Programação e outros.

Como usar vários arquivos de controle no TurboGears inteligentemente? Allan Garcia 1 de outubro de 2007

Uma coisa que as vezes não nos damos conta quando programamos em TurboGears é que ele nada mais é do que Python, e sendo assim pode utilizar todos os recursos disponíveis na linguagem. Parece óbvio, mas eu tenho visto em várias listas de discursões perguntas como:

  • Como faço para criar um instalador para meu projeto TurboGears?
  • Como faço para usar projeto X que tem em TAL framework?
  • Ou pior, vou usar o framework Y porque ele é “compatível” com tal e tal tecnologia.

Todas essas perguntas são simples de responder, pois todos esses projetos são feitos em Python e podem ser importados de um framework para outro sem problema nenhum. Instalador? Arquivos .egg, que é padrão do Python! Veremos respostas mais detalhadas para essas perguntas em artigos futuros.

Outra pergunta que vejo em listas com igual freqüência é: “Como faço para criar vários arquivos de controle no TurboGears? Pois com apenas um arquivo (controllers.py) meu código fica bagunçado e para projetos grandes isso não é o ideial por N motivos”. Realmente um projeto com vários arquivos de controle pode ser muito melhor estruturado e organizado!

Existem várias formas de usar vários arquivos de controle, sendo que normalmente a orientação data em listas é: 1. Cria uma pasta, tipo “modules”, 2. Cria teus arquivos lá dentro, 3. Tem que criar um arquivo “__init__.py” dentro do diretório para funcionar, sem dar nenhuma explicação do porquê disto! e 4. importa as classes para o “controllers.py” conforme tua necessidade e pronto! Funcionar até que funciona, mas não é a forma mais “Pythonista” de resolver este problema.

Entendendo Python Packages

Só esse assunto daria um artigo sozinho, mas vou tentar resumir sem falar difícil. Para o Python a estrutura de diretórios do seu S.O. não existe (pelo menos não da forma que você entende), um diretório é só mais uma forma de se agrupar classes, assim como podemos agrupar usando arquivos. O arquivo “__init__.py”, é o equivalente ao método “def __init__(self):” definido dentro de uma classe, ou seja, ao instanciarmos uma classe qualquer

class foo:
… def __init__(self):
… … print “executei!”

>> objeto = foo()
executei!

Automaticamente o método __init__(self): dentro desta classe será chamado e irá imprimir a string “executei!”. De forma análoga o arquivo “__init__.py” dentro de um diretório funciona, todavia ele é executado no momento que o diretório é importado! Colocando os pingos nos i’s agora, este diretório para o Python é chamado de “Python Package” e pode ser importado da mesma forma que um arquivo. Ex. “controllers.py”.

Começaram a imaginar? Se o TurboGears em um determinado momento importa o arquivo “controllers.py” para anunciar no CherryPy os métodos que estarão disponíveis no projeto, da mesma forma ele fará, se agora, ao invés de um arquivo, tivermos um diretório.

A mágica começa!

Como tudo em Python é falado como magia (e parece mesmo!) vejamos como “sumir” com o arquivo “controllers.py” e ainda assim seu projeto continuar funcionando!

Crie um diretório chamado “controllers” no mesmo diretório do arquivo “controllers.py”

$ mkdir controllers

Mova o arquivo “controllers.py” para dentro do diretório que você acabou de criar, apenas trocando o nome para “__init__.py”.

$ mv controllers.py controllers/__init__.py

Inicie seu projeto! Ele estará funcionando perfeitamente. Isso ocorre porque no momento que o diretório “controllers” foi importado o arquivo “__init__.py” foi executado como se ainda existisse um arquivo “controllers.py”.

Criando outros controles!

Agora é só criar os arquivos de controles desejados dentro desta nova pasta (controllers), como por exemplo um arquivo “cliente.py” para guardar classes relacionadas de formulários, testes, e a classe que herda “controllers.Controllers” do CherryPy.
No arquivo “__init__.py” importe uma classe de dentro deste novo arquivo criado, usando:

>>> from cliente import ClienteControle

E dentro da classe “Root(controllers.RootController):” instancie sua classe usando:

>>> cliente = ClienteControle()

Esta classe estará disponível no endereço “/cliente” do seu projeto.

Pronto! Agora você pode organizar seu projeto com muito mais simplicidade e usar a mesma técnica para outros arquivos, caso entenda necessário. Ex. “model.py”.

Deixe um comentário