Módulos e Pacotes

À medida que seu código cresce, colocar tudo em um único arquivo se torna impraticável. Módulos permitem dividir o código em múltiplos arquivos; pacotes permitem organizar módulos relacionados juntos. Aprender programação modular é o limiar para a verdadeira "engenharia."


1. O que é um Módulo

Em Python, um arquivo .py é um módulo. Você pode usar import para trazer funcionalidades de outros módulos:

Exemplo: Importando Módulos da Biblioteca Padrão

PYTHON
# Importa um módulo inteiro
import math
print(math.pi)              # 3.141592653589793
print(math.sqrt(16))        # 4.0

# Importa uma função específica
from random import randint
print(randint(1, 10))       # Inteiro aleatório entre 1 e 10

# Importa múltiplos itens
from datetime import datetime, timedelta
now = datetime.now()
print(now)                  # Hora atual
▶ Experimente

Python vem com uma grande coleção de módulos da biblioteca padrão — math, random, datetime, os, json... Eles já estão lá quando você instala o Python, basta import e usar.

💡 A biblioteca padrão é uma das maiores vantagens do Python: "Batteries Included" é a filosofia do Python — a maioria das funcionalidades do dia a dia já está fornecida pela biblioteca padrão, sem necessidade de instalação extra.


2. Módulos Personalizados

Criar um módulo é simples — basta escrever um arquivo .py.

my_tools.py

PYTHON
# Este é um módulo personalizado: my_tools.py

def greet(name):
    return f"Olá, {name}"

def add(a, b):
    return a + b

PI = 3.14159

main.py (usando o módulo)

Exemplo: Importando e Usando um Módulo Personalizado

PYTHON
# Importa módulo personalizado
import my_tools

print(my_tools.greet("João Silva"))   # Olá, João Silva
print(my_tools.add(5, 3))            # 8
print(my_tools.PI)                   # 3.14159
▶ Experimente
⚠️ Atenção: Arquivos de módulo personalizados devem estar no mesmo diretório que o arquivo que os chama, ou no caminho de busca do Python. O erro mais comum de iniciantes é obter "ModuleNotFoundError" ao importar seus próprios módulos — verifique o caminho do arquivo.


3. if __name__ == "__main__"

Este é um padrão Python muito importante — permite que um arquivo funcione tanto como um módulo importável quanto como um script diretamente executável:

Exemplo: Padrão de Duplo Propósito if name

PYTHON
# calculator.py
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# O código abaixo só executa quando este arquivo é executado diretamente
if __name__ == "__main__":
    print("Testando funções da calculadora:")
    print(f"3 + 5 = {add(3, 5)}")
    print(f"10 - 4 = {subtract(10, 4)}")
▶ Experimente

Quando você:

💡 Todo arquivo Python tem uma variável __name__. Quando executado diretamente, é "__main__"; quando importado, é o nome do módulo. Este recurso permite que o mesmo arquivo sirva a propósitos duplos como "biblioteca" e "script."


4. Pacotes

Quando você tem muitos módulos, use pacotes para organizá-los — um pacote é um diretório contendo um arquivo __init__.py:

TEXT
my_package/
├── __init__.py      ← Este arquivo é obrigatório (pode estar vazio)
├── math_tools.py
└── string_tools.py
PYTHON
# math_tools.py
def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        return "Não é possível dividir por zero"
    return a / b
PYTHON
# string_tools.py
def reverse(text):
    return text[::-1]

def count_vowels(text):
    vowels = "aeiouAEIOU"
    return sum(1 for c in text if c in vowels)

Exemplo: Usando Módulos de um Pacote

PYTHON
# Usa o pacote
from my_package import math_tools, string_tools

print(math_tools.multiply(3, 5))           # 15
print(string_tools.reverse("Python"))      # nohtyP
▶ Experimente

5. Bibliotecas de Terceiros e pip

O poder do Python vem em grande parte de seu rico ecossistema de bibliotecas de terceiros. Instale-as com pip:

BASH
pip install requests          # Biblioteca de requisições HTTP
pip install numpy             # Computação numérica
pip install pandas            # Análise de dados
pip install flask             # Framework web

requirements.txt

Ao compartilhar seu projeto com outras pessoas, você precisa informar quais bibliotecas de terceiros são necessárias. requirements.txt é para este propósito:

TXT
requests==2.31.0
numpy==1.24.0
pandas==2.0.0
flask==3.0.0

O destinatário pode instalar todas as dependências com um comando:

BASH
pip install -r requirements.txt

Gerando requirements.txt

BASH
pip freeze > requirements.txt
💡 Convenção de projeto: Qualquer projeto que use bibliotecas de terceiros deve ter um requirements.txt no diretório raiz. Esta é uma convenção básica de projetos Python. Mesmo que as versões das bibliotecas atualizem, pip install -r requirements.txt instalará as versões exatas que você usou, garantindo compatibilidade.


Casos de Uso Comuns


❓ Perguntas Frequentes

P: Qual a diferença entre import math e from math import pi? R: import math importa o módulo inteiro; você deve escrever math.pi para usá-lo. from math import pi importa apenas pi; você pode usar pi diretamente. O primeiro é mais claro (você sabe de onde pi vem); o segundo é mais conciso. Não há padrão universal, mas consistência dentro de um arquivo é recomendada. P: O __init__.py precisa estar vazio? R: Não, não precisa estar vazio. __init__.py executa quando o pacote é importado. Você pode colocar código de inicialização lá — definir __all__ para controlar o comportamento de from package import *, ou até mesmo escrever funções utilitárias diretamente nele. Na maioria dos projetos simples, __init__.py está de fato vazio. P: Onde o pip install coloca as bibliotecas instaladas? R: Por padrão, elas vão para o diretório Lib/site-packages/ sob sua instalação Python. Se você tem projetos com diferentes requisitos de dependência, use ambientes virtuais (venv) — cada projeto tem seu próprio diretório de dependências, mantendo-os isolados. Crie um com python -m venv myenv, ative com source myenv/bin/activate.


📖 Resumo


📝 Atividades

  1. Iniciante (Dificuldade ⭐): Crie um módulo geometry.py com duas funções: circle_area(radius) e rectangle_area(width, height). Depois importe e use-as em outro arquivo.

  2. Intermediário (Dificuldade ⭐⭐): Adicione um bloco if __name__ == "__main__" ao geometry.py para testar suas funções. Verifique: executar diretamente executa os testes; importar os pula.

  3. Avançado (Dificuldade ⭐⭐⭐): Crie um pacote string_utils/ com dois módulos: validators.py (funções de validação: is_email(), is_phone()) e transformers.py (funções de transformação: to_snake_case(), to_camel_case()). Escreva um script de teste fora do pacote para importar e usar estes recursos.

100%