Uma Package (pacote) é uma coleção de módulos relacionados armazenados em um diretório e subdiretórios.
Um __name__ é um __name__, exceto quando é __ main__
Dentro de um módulo, o nome do módulo (como uma string) é armazenado no nome global __ name__.
Mas há uma exceção: Se o arquivo de módulo é executado como um programa a partir da linha de comando, Python define __ name__ do módulo para ‘__main__‘.
Este recurso é útil para incluir código (geralmente o código de teste) em um arquivo de módulo que é executado somente quando você iniciar o módulo a partir da linha de comando (digitando: python nomedomodulo.py).
O código fica assim:
if __name__ == '__main__': do something
Quando você inclui o código que é executado somente sob essas circunstâncias, você não tem que remover o código quando você importa o módulo. Isso porque quando um módulo é importado, __ name__ é o nome do módulo, não ‘__main__‘.
Este código vai fora de quaisquer definição de função ou declarações de importação no módulo, geralmente no final do módulo.
Os efeitos de pacotes
Os pacotes são uma outra maneira de tirar vantagem da capacidade do Python para ocultar a complexidade.
Pacotes tem alguns recursos úteis:
- Um pacote tem seu próprio namespace.
- Nomes definidos dentro de um módulo, incluindo nomes de módulos não conflitam com os nomes definidos em outro lugar.
- Os pacotes podem conter módulos.
- Os pacotes podem conter sub pacotes.
- Pacotes são ideais para armazenar e organizar uma série de características relacionadas.
Requisitos e Orientações Para os Pacotes:
- Um pacote vive dentro de um diretório e seus sub pacotes vivem dentro de sub diretórios desse diretório (em geral).
- Assim como um módulo de arquivos nomeia o módulo, um pacote de diretório nomeia o pacote.
- Isso permite importar itens do pacote, usando a importação no formato packagename.modulename.
- Um diretório do pacote deve conter um arquivo chamado __ init__.py.
No caso mais simples, __ init__.py é apenas um arquivo vazio. Mas, muitas vezes, contém código que inicializa o pacote. Por exemplo, a melhor maneira de importar um específico sub módulo com um pacote ou sub pacotes particular é carregá-los no arquivo __init__.py.
O arquivo __init__.py às vezes contém a lista: __ all__
Esta lista ajuda código Python executado em diferentes sistemas operacionais. Quando você inclui nomes de módulos em __all__, o comando de importação: from packagename import * – importa apenas estes módulos.
Sobre diretórios e pacotes especiais
Quando Python é instalado, ele cria diretórios específicos para pacotes. Se você armazenar pacotes em um desses diretórios especiais de pacote, é menos provável ter problemas se os seus nomes de pacotes são os mesmos que os nomes dos módulos em outros lugares no caminho Python.
- Diretório: lib/local-python/ – Este diretório é para pacotes que funcionam da mesma maneira com todas as versões do Python.
- Diretório: Lib/pythonXX/site-packages/ – Este diretório é para os pacotes que dependem da versão do Python. Alterações XX representam o número da versão do Python.
Estrutura de Packages
Você pode ver melhor como é uma estrutura de packages Python na imagem abaixo:
Exemplo:
Neste exemplo criamos um projeto chamado Prj_Dev01 e na raiz do projeto temos o modulo principal.py, logo temos um pacote chamado devaberto(em Python uma package é apenas um diretório que contém o arquivo __init__.py) e dentro dele temos um modulo chamado msg.py e o arquivo de controle do pacote chamado __init__.py.
Python
Principal.py
#!/usr/bin/env python # -*- coding: latin-1 -*- # Desenvolvimento Aberto # Principal.py # Importa pacote import devaberto.msg # Importa OS import os # Limpa a tela os.system("clear") print "Modulo Principal" print "\n" devaberto.msg.menssagem("Minha menssagem") devaberto.msg.msg2('menssagem2') # Cria uma espera no terminal raw_input()
__init__.py
#!/usr/bin/env python # -*- coding: latin-1 -*- # Desenvolvimento Aberto __all__ = ['msg'] # Importa pacote import msg
msg.py
#!/usr/bin/env python # -*- coding: latin-1 -*- # Desenvolvimento Aberto # msg.py def menssagem (x): print x def msg2(x): print x print x