Pacotes em Python

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 para create_order,
  • o create_delivery para start_delivery,
  • e o create_billing para issue_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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *