Módulos e import

Separar funções em arquivos e reutilizá-las.

Módulos e import

Objetivo da aula

Separar funções em arquivos e reutilizá-las.

Regra desta aula: vamos assumir que você nunca viu este assunto antes. Nenhum termo importante será usado sem explicação e todo exemplo deve ser entendido linha por linha, não apenas copiado.

Começando do zero

Um módulo Python é, de forma simples, um arquivo de código que pode ser importado por outro arquivo. Separar funções em módulos ajuda a organizar responsabilidades e reutilizar código. import torna nomes de outro módulo disponíveis por uma interface explícita.

Uma imagem mental para entender

Imagine um fichário com divisórias: “cálculos”, “arquivos”, “interface”. Cada divisória guarda um conjunto relacionado de instruções. Em vez de colocar tudo em uma folha enorme, módulos dividem o programa em arquivos com papéis claros.

Conceitos essenciais, sem pular etapas

Módulo

Um arquivo .py que pode definir funções, constantes e outros nomes.

import modulo

Carrega o módulo e normalmente acessamos membros como modulo.funcao().

from modulo import nome

Importa um nome específico para o escopo atual. É conveniente, mas deve permanecer claro de onde o nome veio.

__name__

Quando um arquivo é executado diretamente, seu __name__ é "__main__". Quando é importado, __name__ corresponde ao módulo. Isso permite separar definições de um ponto de entrada.

Evitar efeito inesperado ao importar

Código de teste ou interface colocado no nível superior roda durante a importação. O padrão if __name__ == "__main__": ajuda a controlar esse comportamento.

Modelo mental

MÓDULO A DEFINE → MÓDULO B IMPORTA → USA INTERFACE → PONTO DE ENTRADA COORDENA

Exemplo 1 — primeiro veja o programa inteiro

# arquivo calculos.py
def dobro(numero):
    return numero * 2

# arquivo app.py
import calculos

resultado = calculos.dobro(7)
print(resultado)

Agora vamos ler linha por linha

  • calculos.py define uma responsabilidade reutilizável.
  • app.py importa o módulo pelo nome.
  • A notação calculos.dobro deixa claro de onde veio a função.
  • Os dois arquivos precisam estar em uma organização de importação compatível; neste curso, manter na mesma pasta simplifica o exercício.

Saída esperada

14

Exemplo 2 — o mesmo conceito em outra situação

def main():
    print("Programa iniciado")

if __name__ == "__main__":
    main()

Quando esse arquivo é executado diretamente, main() roda. Se for importado por outro módulo, as definições ficam disponíveis sem executar automaticamente o ponto de entrada.

Experimento guiado

Não pule esta parte. Programação só começa a fazer sentido quando você prevê um resultado, executa e compara a previsão com o que realmente aconteceu.

  1. Crie calculos.py e app.py na mesma pasta.
  2. Importe o módulo e chame uma função.
  3. Adicione temporariamente um print() no nível superior de calculos.py e observe que ele roda ao importar; depois remova.
  4. Use o padrão main() no arquivo principal.

Mini desafio

Crie módulo texto.py com função normalizar(texto) que retorne texto.strip().lower(). Importe em app.py.

Solução comentada

# texto.py
def normalizar(texto):
    return texto.strip().lower()

# app.py
import texto
print(texto.normalizar("  SIM  "))

Depois de executar a solução, altere pelo menos um valor e explique por que o novo resultado mudou. Se você só copiou e não consegue explicar cada linha, refaça o desafio em uma versão menor.

Erros comuns e por que acontecem

  • Criar arquivos com nomes que conflitam com módulos da biblioteca padrão, como json.py, e depois confundir a importação.
  • Executar código de interface no nível superior de um módulo reutilizável e provocar efeitos ao importar.
  • Usar from modulo import * e perder clareza sobre a origem dos nomes.
  • Circular dependências entre módulos sem compreender a ordem de importação.

Cheque se você realmente entendeu

O que é um módulo neste contexto?

Resposta: Um arquivo Python que define código reutilizável e pode ser importado.

Para que serve o padrão if __name__ == "__main__"?

Resposta: Para executar um ponto de entrada apenas quando o arquivo é executado diretamente.

Qual vantagem de modulo.funcao()?

Resposta: Deixa explícita a origem da função e organiza o namespace.

Resumo em linguagem simples

Nesta aula, o ponto central foi Módulos e import. Tente explicar o modelo MÓDULO A DEFINE → MÓDULO B IMPORTA → USA INTERFACE → PONTO DE ENTRADA COORDENA sem olhar a tela. Depois, escreva um exemplo próprio menor que os apresentados. Esse exercício de explicação é parte do aprendizado, não um extra.

Conexão com a próxima aula

Na próxima aula, Organização de um pequeno programa, vamos aproveitar exatamente o que foi construído aqui. Você não precisa memorizar tudo; precisa conseguir reconhecer o conceito e reconstruí-lo com raciocínio e testes.