Módulos Python
Aprenda como os módulos Python funcionam: crie os seus, importe com aliases, use from-import, explore a biblioteca padrão e entenda o sys.path.
Um módulo é um arquivo contendo código Python — funções, classes e variáveis — que pode ser reutilizado em múltiplos programas. Os módulos são a unidade básica de organização de código em Python: em vez de copiar lógica entre arquivos, você a escreve uma vez, salva como um arquivo .py e a importa onde for necessário. Este capítulo abrange desde a criação do seu primeiro módulo até a navegação pela biblioteca padrão e a compreensão de como Python localiza módulos em tempo de execução.
O que é um Módulo Python?
Qualquer arquivo .py é um módulo. Quando você escreve:
# greetings.py
def hello(name):
return f"Hello, {name}!"
def goodbye(name):
return f"Goodbye, {name}!"
PI = 3.14159você criou um módulo chamado greetings. O nome do módulo é o nome do arquivo sem a extensão .py.
Os módulos podem conter:
- Funções — blocos de lógica reutilizáveis (veja Python Functions)
- Classes — modelos para objetos (veja Python Classes)
- Variáveis e constantes — dados compartilhados
- Declarações executáveis — código que é executado quando o módulo é importado ou executado diretamente
Importando um Módulo
Use a instrução import seguida do nome do módulo (sem a extensão .py).
import greetings
print(greetings.hello("Alice")) # Hello, Alice!
print(greetings.goodbye("Alice")) # Goodbye, Alice!
print(greetings.PI) # 3.14159Após import greetings, todos os nomes definidos em greetings.py ficam acessíveis através do prefixo greetings.. Esta notação de ponto evita colisões de nomes — sua própria variável PI não pode entrar em conflito com greetings.PI.
Importando Nomes Específicos com from ... import
Se você precisa de apenas um ou dois nomes, importe-os diretamente para poder usá-los sem o prefixo do módulo.
from greetings import hello, PI
print(hello("Bob")) # Hello, Bob!
print(PI) # 3.14159Importando Tudo com *
from greetings import *Isso traz todos os nomes públicos (aqueles que não começam com _) para o namespace atual. Evite isso em programas maiores: polui o namespace e dificulta identificar de onde vem um nome.
Aliases de Importação com as
Nomes de módulos longos se tornam tediosos de digitar. Use as para criar um alias mais curto.
import greetings as gr
print(gr.hello("Carol")) # Hello, Carol!Você também pode criar aliases para nomes importados individualmente:
from greetings import hello as hi
print(hi("Dave")) # Hello, Dave!Aliases são especialmente comuns com bibliotecas populares:
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltA Função dir()
dir(module) retorna uma lista ordenada de todos os nomes definidos em um módulo — uma maneira rápida de explorar o que está disponível.
import math
print(dir(math))
# ['__doc__', '__loader__', ..., 'acos', 'acosh', 'asin', ..., 'sqrt', 'tan', 'tanh', 'tau']Chame dir() sem argumentos para ver os nomes no escopo atual.
A Variável __name__
Todo módulo tem uma variável embutida chamada __name__. Quando um arquivo é importado, __name__ é definido como o nome do módulo. Quando o arquivo é executado diretamente, __name__ é definido como a string "__main__".
Este padrão é a forma padrão de escrever código que só é executado quando o arquivo é executado como script — e não quando é importado como biblioteca:
# greetings.py
def hello(name):
return f"Hello, {name}!"
if __name__ == "__main__":
# This block only runs when you execute: python greetings.py
print(hello("World"))import greetings # The if-block does NOT run hereEste padrão é usado em quase todos os arquivos Python não triviais que você encontrará.
Caminho de Busca de Módulos (sys.path)
Quando você escreve import greetings, Python busca o módulo em uma lista de diretórios armazenados em sys.path:
- O diretório do script sendo executado (ou o diretório atual no modo interativo)
- Diretórios listados na variável de ambiente
PYTHONPATH - Os diretórios da biblioteca padrão
- O diretório
site-packages(onde ficam os pacotes de terceiros instalados pelo pip)
import sys
print(sys.path)
# ['/path/to/script', '/usr/lib/python3.11', ..., '/usr/lib/python3/dist-packages']Você pode adicionar um caminho em tempo de execução, mas isso raramente é necessário para projetos bem estruturados:
import sys
sys.path.append("/path/to/my/libs")A Biblioteca Padrão do Python
Python vem com uma grande biblioteca padrão — centenas de módulos cobrindo desde E/S de arquivos até protocolos de rede e compressão de dados. Não é necessário instalar nada; basta importá-los.
math — Funções Matemáticas
import math
print(math.sqrt(16)) # 4.0
print(math.pi) # 3.141592653589793
print(math.factorial(5)) # 120
print(math.ceil(4.2)) # 5
print(math.floor(4.8)) # 4Veja Python Math para uma referência completa.
random — Números Aleatórios
import random
print(random.randint(1, 10)) # random integer between 1 and 10
print(random.choice(["a", "b", "c"])) # random element
print(random.random()) # float in [0.0, 1.0)
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)
print(numbers) # shuffled in placedatetime — Datas e Horas
import datetime
now = datetime.datetime.now()
print(now) # 2024-03-15 10:30:45.123456
print(now.year) # 2024
print(now.strftime("%B %d, %Y")) # March 15, 2024
today = datetime.date.today()
print(today) # 2024-03-15Veja Python Dates para cobertura completa de aritmética e formatação de datas.
os e sys — Sistema Operacional e Interpretador
import os
print(os.getcwd()) # current working directory
print(os.listdir(".")) # files in the current directory
os.makedirs("new_dir", exist_ok=True) # create a directory
print(os.path.join("folder", "file.txt")) # 'folder/file.txt'import sys
print(sys.version) # Python version string
print(sys.platform) # 'linux', 'darwin', 'win32', etc.
sys.exit(0) # terminate the program with exit code 0json — Codificação e Decodificação JSON
import json
data = {"name": "Alice", "age": 30, "active": True}
# Python → JSON string
json_string = json.dumps(data, indent=2)
print(json_string)
# JSON string → Python
parsed = json.loads(json_string)
print(parsed["name"]) # AliceVeja Python JSON para leitura e escrita baseadas em arquivo.
collections — Estruturas de Dados Especializadas
from collections import Counter, defaultdict
# Count occurrences
words = ["apple", "banana", "apple", "cherry", "banana", "apple"]
counts = Counter(words)
print(counts) # Counter({'apple': 3, 'banana': 2, 'cherry': 1})
print(counts.most_common(2)) # [('apple', 3), ('banana', 2)]
# Dict with default values
scores = defaultdict(int)
scores["Alice"] += 10
scores["Bob"] += 5
print(dict(scores)) # {'Alice': 10, 'Bob': 5}Veja Python Collections Module para namedtuple, deque e OrderedDict.
Criando Seu Próprio Módulo
Estrutura Básica
Os módulos funcionam melhor quando fazem uma coisa bem feita. Uma boa regra prática: se um grupo de funções compartilha um tema, coloque-as em seu próprio arquivo.
# mathutils.py
def clamp(value, minimum, maximum):
"""Restrict value to the range [minimum, maximum]."""
return max(minimum, min(value, maximum))
def average(numbers):
"""Return the arithmetic mean of a list of numbers."""
if not numbers:
raise ValueError("Cannot average an empty list")
return sum(numbers) / len(numbers)
def is_prime(n):
"""Return True if n is a prime number."""
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True# main.py
from mathutils import clamp, average, is_prime
print(clamp(15, 0, 10)) # 10
print(average([2, 4, 6, 8])) # 5.0
print(is_prime(17)) # TrueDocstrings em Módulos
Adicione uma docstring no nível do módulo no topo do arquivo. Ferramentas como help() e geradores de documentação a utilizam.
"""
mathutils.py — Utility functions for common mathematical operations.
Functions:
clamp(value, minimum, maximum) -> number
average(numbers) -> float
is_prime(n) -> bool
"""Variáveis de Módulo: __all__
__all__ é uma lista de nomes que devem ser exportados quando alguém faz from module import *. Também serve como documentação sobre a API pública do módulo.
# mathutils.py
__all__ = ["clamp", "average", "is_prime"]
def _helper(): # leading underscore marks it as private
passRecarregando um Módulo
Python armazena em cache os módulos importados em sys.modules. Importar o mesmo módulo duas vezes não o executa novamente — Python retorna a versão em cache. Durante o desenvolvimento interativo ou depuração, você pode forçar um recarregamento:
import importlib
import greetings
importlib.reload(greetings)Isso é necessário principalmente em sessões REPL ou notebooks Jupyter após editar um arquivo de módulo.
Armadilhas Comuns
Importações Circulares
Se module_a importa module_b e module_b importa module_a, você tem uma importação circular. Python consegue lidar com algumas importações circulares, mas elas são confusas e geralmente indicam um problema de design. A solução normalmente é reestruturar o código — mover a lógica compartilhada para um terceiro módulo, ou adiar a importação para dentro de uma função.
Sombreando um Módulo da Biblioteca Padrão
Se você nomear seu arquivo math.py, random.py ou json.py, você irá sombrear o módulo da biblioteca padrão e quebrar qualquer código que o importe. Use nomes específicos e descritivos para seus próprios módulos.
# BAD: naming your file math.py shadows the stdlib
# GOOD: name it mathutils.py or geometry.pyImportError e ModuleNotFoundError
ModuleNotFoundError (uma subclasse de ImportError) significa que Python não conseguiu encontrar o módulo em nenhum lugar do sys.path. Causas comuns:
- Um erro de digitação no nome do módulo
- O módulo não está instalado (
pip install <package-name>) - O arquivo do módulo está em um diretório que não está no
sys.path
try:
import nonexistent_module
except ModuleNotFoundError as e:
print(f"Import failed: {e}")
# Import failed: No module named 'nonexistent_module'Módulos vs. Pacotes
Um módulo é um único arquivo .py. Um pacote é um diretório contendo múltiplos módulos e um arquivo __init__.py. Pacotes permitem construir bibliotecas maiores com uma estrutura hierárquica. Veja Python Packages para a história completa.
Módulos Populares de Terceiros
Além da biblioteca padrão, o ecossistema Python no PyPI possui centenas de milhares de pacotes. Instale-os com pip.
| Pacote | Finalidade |
|---|---|
numpy | Computação numérica, arrays multidimensionais |
pandas | Análise e manipulação de dados |
matplotlib | Visualização de dados e plotagem |
requests | Requisições HTTP simplificadas |
flask / django | Frameworks web |
scikit-learn | Algoritmos de aprendizado de máquina |
pytest | Framework de testes |