Blog em português onde relato a minha aprendizagem de Python. Sendo um blog, ele deve ser lido de baixo para cima e é escrito orientado a uma audiência com alguns conhecimentos de programação. Não tentando ser uma fonte exaustiva de conhecimento sobre Python, pode, no entanto, servir como crash course a esta linguagem.

Saturday, September 5, 2009

Pacotes

Pacotes são uma forma de estruturar conjuntos de módulos de uma forma lógica e útil.

Suponha que quer construir um conjunto de módulos para lidar de forma transparente com vários tipos de imagens. Ler e escrever vários tipos de formatos bem como conseguir aplicar diferentes tipos de efeitos gráficos. Uma possível estrutura para os diferentes módulos é a seguinte:

Imagens/
  formatos/
    jpgread.py
    jpgwrite.py
    bmpread.py
    ...
  efeitos/
    blur.py
    sharpen.py
    ...

Em python aquilo que transforma um conjunto de módulos e directorias num pacote é a presença de um ficheiro chamado __init__.py  na directoria de topo. Este ficheiro é executado quando o pacote ou algum módulo do pacote é importado e, na sua forma mais simples pode ser um ficheiro vazio. A partir de Python 2.5, uma subdirectoria de um pacote é automáticamente um pacote mesmo que esta não contenha o seu __init__.py e esta regra é válida para todas as profundidades.

 Módulos complexos devem usar o ficheiro __init__.py para inicializações. Assim, ficamos com a seguinte hierarquia:

Imagens/
  __init__.py

  formatos/
    jpgread.py
    jpgwrite.py
    bmpread.py
    ...
  efeitos/
    blur.py
    sharpen.py
    ...

cujos  módulos podem ser importados de forma parecida ao Java. Exemplo:
import Imagens.efeitos.blur
cujas funções teriam que ser referenciadas com o nome completo. Para contornar este "problema" podemos também usar a forma from Imagens.efeitos import blur cuja semântica é exactamente igual que quando um módulo não pertencente a um pacote é importado.


Módulos podem importar-se entre si usando caminhos absolutos (a partir de imagens) ou mesmo caminhos relativos.


Por último, os pacotes podem residir no sistema de ficheiros (numa qualquer directoria referenciada por PYTHONPATH) ou ainda num ficheiro do tipo zip de forma transparente.