Imports no Python | Python
- Imports no Python | Python
Visão Geral
O sistema de imports do Python permite:
- Reutilização de código
- Organização modular
- Isolamento de responsabilidades
- Criação de pacotes hierárquicos
Todo import no Python envolve três conceitos fundamentais:
- Módulo
- Pacote
- Namespace
O que é um módulo
Um módulo é qualquer arquivo .py.
Exemplo:
math_utils.py
def soma(a, b):
return a + b
Importando:
import math_utils
resultado = math_utils.soma(2, 3)
O que é um pacote
Um pacote é uma pasta contendo módulos.
Estrutura:
project/
│
└── utils/
├── __init__.py
├── math_utils.py
└── string_utils.py
Importando:
from utils.math_utils import soma
O arquivo __init__.py define explicitamente o diretório como pacote.
Documentação sobre __init__.py: 🔗 Clique aqui
Tipos de Import
1. Import padrão
import math
Uso:
math.sqrt(16)
2. Import específico
from math import sqrt
Uso:
sqrt(16)
3. Import com alias
import numpy as np
np.array([1, 2, 3])
4. Import múltiplo
from math import sqrt, pow
5. Import tudo (não recomendado)
from math import *
Problemas:
- Polui namespace
- Pode sobrescrever nomes
- Dificulta leitura
Import absoluto
Import absoluto começa do pacote raiz.
Estrutura:
project/
│
└── app/
├── __init__.py
├── models.py
└── database.py
Import correto:
from app.database import Base
Vantagens:
- Claro
- Escalável
- Compatível com produção
- Evita ambiguidade
Import relativo
Usa . para navegar na hierarquia.
Mesmo exemplo:
from .database import Base
Significado:
.→ mesmo pacote..→ pacote pai
Exemplo:
from ..core.config import settings
Limitações:
- Só funciona dentro de pacotes
- Não funciona em execução direta de script
Como o Python resolve imports
O Python usa:
import sys
print(sys.path)
Ordem de busca:
- Diretório atual
- Diretórios em PYTHONPATH
- Site-packages
- Bibliotecas padrão
Namespace
Import cria namespaces.
Exemplo:
import math
Namespace:
math.sqrt
math.pi
Sem import:
sqrt(4) # erro
Com import específico:
from math import sqrt
Agora sqrt está no namespace global.
Execução como script vs módulo
Script:
python main.py
Módulo:
python -m package.main
Diferença:
-mpreserva estrutura de pacote- Script direto altera contexto de import
Erro comum: ModuleNotFoundError
Causa frequente:
from database import Base
Mas estrutura é:
app/database.py
Solução:
from app.database import Base
Manipulando PYTHONPATH
Linux/macOS:
export PYTHONPATH=/caminho/do/projeto
Windows PowerShell:
$env:PYTHONPATH="C:\projeto"
Evite usar isso em produção.
Prefira estrutura correta de pacote.
init.py
Arquivo especial que:
- Marca diretório como pacote
- Pode executar código ao importar
- Pode expor interface pública
Exemplo:
# utils/__init__.py
from .math_utils import soma
__all__ = ["soma"]
Agora:
from utils import soma
all
Define o que será exportado com import *.
__all__ = ["soma"]
Sem isso, todos símbolos públicos são exportados.
Import dinâmico
import importlib
modulo = importlib.import_module("math")
print(modulo.sqrt(16))
Uso comum:
- Plugins
- Sistemas extensíveis
- Carregamento condicional
Import condicional
try:
import ujson as json
except ImportError:
import json
Imports circulares
Problema:
# a.py
import b
# b.py
import a
Isso causa erro de inicialização parcial.
Soluções:
- Reorganizar código
- Import local dentro de função
Exemplo:
def func():
from module import dependency
Boas práticas
- Sempre use import absoluto em projetos grandes
- Evite
import * - Organize código em pacotes
- Evite lógica em
__init__.py - Não manipule sys.path manualmente
- Use virtual environments
Estrutura recomendada para projetos
project/
│
├── package_name/
│ ├── __init__.py
│ ├── core/
│ ├── models/
│ └── services/
│
└── main.py
Imports:
from package_name.models.user import User
Conceito interno (CPython)
Quando você faz:
import module
O Python:
- Procura no sys.path
- Localiza arquivo
- Compila para bytecode (.pyc)
- Executa o módulo
- Armazena em sys.modules
- Reutiliza se importar novamente
Cache de módulos
Ver módulos carregados:
import sys
print(sys.modules.keys())
Módulos são carregados uma única vez por processo.
Resumo estrutural
Formato completo de import:
package.subpackage.module.object
Exemplo real:
from collections.abc import Iterable
Hierarquia:
collections → abc → Iterable
Se quiser aprofundar, posso gerar documentação adicional sobre:
- Como funciona o import loader interno
- Meta path finders
- Import hooks
- Estrutura enterprise para projetos grandes
- Organização de monorepos Python