Módulos Python mais úteis da biblioteca padrão
A biblioteca padrão do Python é gigante. Aqui estão os módulos mais úteis que pouca gente usa.
A biblioteca padrão é um tesouro escondido
Python vem com "baterias incluídas" — centenas de módulos prontos para uso, sem instalar nada. O problema é que a maioria das pessoas só conhece os, sys e json. Vamos mudar isso.
1. collections — Estruturas de dados turbinadas
Counter: contar coisas
from collections import Counter
votos = ["Ana", "Pedro", "Ana", "Maria", "Ana", "Pedro"]
contagem = Counter(votos)
print(contagem)
# Counter({'Ana': 3, 'Pedro': 2, 'Maria': 1})
print(contagem.most_common(2))
# [('Ana', 3), ('Pedro', 2)]
defaultdict: dicionário com valor padrão
from collections import defaultdict
# Agrupar alunos por nota
alunos = [("Ana", "A"), ("Pedro", "B"), ("Maria", "A"), ("João", "B")]
grupos = defaultdict(list)
for nome, nota in alunos:
grupos[nota].append(nome)
print(dict(grupos))
# {'A': ['Ana', 'Maria'], 'B': ['Pedro', 'João']}
Sem defaultdict, você precisaria verificar se a chave existe antes de adicionar.
2. itertools — Combinações e iterações poderosas
product: todas as combinações possíveis
from itertools import product
cores = ["vermelho", "azul"]
tamanhos = ["P", "M", "G"]
for cor, tamanho in product(cores, tamanhos):
print(f"{cor} {tamanho}")
# vermelho P, vermelho M, vermelho G
# azul P, azul M, azul G
chain: juntar vários iteráveis
from itertools import chain
lista1 = [1, 2, 3]
lista2 = [4, 5, 6]
lista3 = [7, 8, 9]
for n in chain(lista1, lista2, lista3):
print(n, end=" ")
# 1 2 3 4 5 6 7 8 9
groupby: agrupar elementos consecutivos
from itertools import groupby
dados = [("fruta", "maçã"), ("fruta", "banana"), ("vegetal", "cenoura"), ("vegetal", "brócolis")]
for tipo, itens in groupby(dados, key=lambda x: x[0]):
print(f"{tipo}: {[item[1] for item in itens]}")
# fruta: ['maçã', 'banana']
# vegetal: ['cenoura', 'brócolis']
3. pathlib — Caminhos de arquivo modernos
Esqueça os.path. O pathlib é muito mais legível:
from pathlib import Path
# Criar caminho
pasta = Path("projetos") / "meu_app" / "config.json"
print(pasta) # projetos/meu_app/config.json
# Informações do arquivo
arquivo = Path("foto.png")
print(arquivo.suffix) # .png
print(arquivo.stem) # foto
print(arquivo.name) # foto.png
# Listar arquivos
for py in Path(".").glob("**/*.py"):
print(py)
# Ler e escrever
Path("notas.txt").write_text("Olá, mundo!")
conteudo = Path("notas.txt").read_text()
4. functools — Ferramentas para funções
lru_cache: memorização automática
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(100)) # instantâneo, sem recursão explodindo
# 354224848179261915075
Sem cache, fibonacci(100) levaria uma eternidade. Com cache, é instantâneo.
partial: criar funções parciais
from functools import partial
def potencia(base, expoente):
return base ** expoente
quadrado = partial(potencia, expoente=2)
cubo = partial(potencia, expoente=3)
print(quadrado(5)) # 25
print(cubo(3)) # 27
5. secrets — Senhas e tokens seguros
Nunca use random para segurança. Use secrets:
import secrets
# Token seguro para URLs
token = secrets.token_urlsafe(32)
print(token) # algo como: dGhpcyBpcyBhIHRva2Vu...
# Senha aleatória
import string
alfabeto = string.ascii_letters + string.digits
senha = "".join(secrets.choice(alfabeto) for _ in range(16))
print(senha) # algo como: kR7mN2xP9qL4vB5j
# Comparação segura contra timing attacks
secrets.compare_digest("minha_senha", entrada_usuario)
6. textwrap — Formatar texto
import textwrap
texto_longo = "Python é uma linguagem de programação de alto nível, interpretada, de script, imperativa, orientada a objetos, funcional, de tipagem dinâmica e forte."
# Quebrar em linhas de 40 caracteres
print(textwrap.fill(texto_longo, width=40))
# Remover indentação comum
codigo = """
def hello():
print("Olá")
hello()
"""
print(textwrap.dedent(codigo))
# Encurtar texto
print(textwrap.shorten(texto_longo, width=50, placeholder="..."))
# Python é uma linguagem de programação...
7. dataclasses — Classes sem boilerplate
from dataclasses import dataclass
@dataclass
class Produto:
nome: str
preco: float
estoque: int = 0
p = Produto("Notebook", 3500.00, 10)
print(p) # Produto(nome='Notebook', preco=3500.0, estoque=10)
# Comparação automática
p2 = Produto("Notebook", 3500.00, 10)
print(p == p2) # True
Sem @dataclass, você precisaria escrever __init__, __repr__, __eq__... tudo na mão.
8. enum — Constantes organizadas
from enum import Enum
class Status(Enum):
PENDENTE = "pendente"
APROVADO = "aprovado"
REJEITADO = "rejeitado"
pedido = Status.APROVADO
print(pedido.value) # aprovado
if pedido == Status.APROVADO:
print("Pedido aprovado!")
# Listar todos
for s in Status:
print(s.name, "→", s.value)
Melhor que usar strings soltas ou constantes que ninguém sabe de onde vieram.
Resumo
| Módulo | Para que serve |
|---|---|
collections |
Counter, defaultdict, namedtuple |
itertools |
Combinações, agrupamentos, encadeamento |
pathlib |
Manipulação moderna de caminhos |
functools |
Cache, funções parciais |
secrets |
Tokens e senhas seguras |
textwrap |
Formatação de texto |
dataclasses |
Classes sem boilerplate |
enum |
Constantes organizadas |
A próxima vez que pensar em instalar um pacote externo, verifique se a biblioteca padrão já não resolve. Você vai se surpreender com a frequência.