Resumo: neste tutorial, você aprenderá sobre os pacotes Python e como usá-los para estruturar seu aplicativo.
Introdução aos pacotes Python
Suponha que você precise desenvolver um grande aplicativo que lide com o processo de vendas do pedido ao pagamento.
A aplicação terá muitos módulos. Quando o número de módulos aumentar, será difícil manter todos eles em um único local.
E você pode querer agrupar módulos em algo significativo.
É aqui que os pacotes entram em jogo.
Os pacotes permitem organizar os módulos na estrutura hierárquica.
A maneira como o Python organiza pacotes e módulos como o sistema operacional estrutura as pastas e arquivos.
Para criar um pacote, você cria uma nova pasta e coloca os módulos relevantes nessa pasta.
Para instruir o Python a tratar uma pasta contendo arquivos como um pacote, você precisa criar um arquivo __init__.py
na pasta.
Observe que a partir do Python 3.3, o Python introduziu o recurso de pacotes de namespace implícitos. Isso permite que o Python trate uma pasta como um pacote sem a extensão __init__.py
.
Por exemplo, a imagem a seguir mostra o pacote sales
que contém três módulos, incluindo order
, delivery
e billing
:
Importando pacotes no Python
Para importar um pacote, você usa a instrução import
como esta:
import package.module
E para acessar um objeto de um módulo que pertence a um pacote, você usa a notação de ponto:
package.module.function
Veja a seguir como usar funções nos módulos order
, delivery
e billing
do pacote sales
:
# main.py
import sales.order
import sales.delivery
import sales.billing
sales.order.create_sales_order()
sales.delivery.create_delivery()
sales.billing.create_billing()
Para tornar o código mais conciso, você pode usar a seguinte instrução para importar uma função de um módulo:
from <module> import <function>
Por exemplo:
# main.py
from sales.order import create_sales_order
from sales.delivery import create_delivery
from sales.billing import create_billing
create_sales_order()
create_delivery()
create_billing()
É possível renomear o objeto ao importá-lo:
# main.py
from sales.order import create_sales_order as create_order
from sales.delivery import create_delivery as start_delivery
from sales.billing import create_billing as issue_billing
create_order()
start_delivery()
issue_billing()
Neste exemplo, renomeamos…
- o
create_sales_order
paracreate_order
, - o
create_delivery
parastart_delivery
, - e o
create_billing
paraissue_billing
.
Inicializando um pacote
Por convenção, quando você importa um pacote, o Python executa o __init__.py
desse pacote.
Portanto, você pode colocar o código no arquivo __init__.py
para inicializar os dados em nível de pacote.
O exemplo a seguir define uma taxa de imposto padrão no pacote __init__.py
de vendas:
# __init__.py
# default sales tax rate
TAX_RATE = 0.07
A partir do arquivo main.py
, você pode acessar TAX_RATE
a partir do pacote sales
assim:
# main.py
from sales import TAX_RATE
print(TAX_RATE)
Além de inicializar os dados em nível de pacote, o __init__.py
também permite importar módulos automaticamente do pacote.
Por exemplo, no __init__.py
, se você colocar a seguinte declaração:
# __init__.py
# import the order module automatically
from sales.order import create_sales_order
# default sales tax rate
TAX_RATE = 0.07
E importe o pacote sales
do arquivo main.py, a função create_sales_order
estará disponível automaticamente da seguinte forma:
# main.py
import sales
sales.order.create_sales_order()
from <pacote> import *
Quando você usa a instrução para importar todos os objetos de um pacote:
from <package> import *
O Python procurará o arquivo __init__.py
.
Se o arquivo __init__.py
existir, ele carregará todos os módulos especificados em uma lista especial chamada __all__
no arquivo.
Por exemplo, você pode colocar os módulos de pedido e entrega na lista __all__
assim:
# __init__.py
__all__ = [
'order',
'delivery'
]
E use a seguinte declaração de importação no main.py:
# main.py
from sales import *
order.create_sales_order()
delivery.create_delivery()
# cannot access the billing module
A partir do main.py, você pode acessar as funções definidas nos módulos order
e delivery
. Mas você não pode ver o módulo billing
porque não está na lista __all__
.
Subpacotes
Os pacotes podem conter subpacotes. Os subpacotes permitem que você organize ainda mais os módulos.
O seguinte mostra o pacote sales
que contém três subpacotes: order
, delivery
e billing
. Cada subpacote possui o módulo correspondente.
Por exemplo, você pode colocar todos os outros módulos relacionados ao processamento de pedidos no subpacote order
:
Tudo o que você aprendeu sobre pacotes também é relevante para subpacotes.
Por exemplo, para importar uma função do subpacote order
, use a seguinte instrução import
:
# main.py
from sales.order import create_sales_order
create_sales_order()
Resumo
- Um pacote Python contém um ou mais módulos. Python usa a estrutura de pastas e arquivos para gerenciar pacotes e módulos.
- Use o arquivo
__init__.py
se desejar inicializar os dados em nível de pacote. - Use a variável
__all__
para especificar os módulos que serão carregados automaticamente ao importar o pacote. - Um pacote pode conter subpacotes.