Módulo 3 - Dataclasses e estruturas de dados

dataclass, namedtuple, dict e tupla: qual usar

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Comparar dataclass, namedtuple, dicionário e tupla lado a lado.
  • Reconhecer a namedtuple como tupla com campos nomeados.
  • Saber quando um dicionário ou uma tupla simples já basta.
  • Escolher a estrutura certa pelo problema em mãos.

namedtuple: tupla com nomes

Antes das dataclasses, a namedtuple já resolvia um problema comum: dar nome aos campos de uma tupla. Em vez de acessar ponto por posição, com o índice zero e um, você acessa por nome, ponto x e ponto y. A namedtuple é imutável, leve e continua sendo uma tupla de verdade, então funciona em qualquer lugar que espera uma tupla. É uma ótima escolha para agrupamentos pequenos e fixos de dados que não precisam de métodos nem de validação.

from collections import namedtuple

Ponto = namedtuple("Ponto", ["x", "y"])

p = Ponto(3, 4)
print(p.x, p.y)   # 3 4  (acesso por nome)
print(p[0], p[1]) # 3 4  (acesso por posicao, ainda e tupla)

# Imutavel, como toda tupla:
# p.x = 10  # AttributeError

# Desempacota como tupla:
a, b = p
print(a, b)  # 3 4

namedtuple: acesso por nome e por posição, imutável, leve, ainda é uma tupla.

A namedtuple e a dataclass frozen se parecem: ambas são imutáveis e têm campos nomeados. A diferença é o alcance. A dataclass aceita valores padrão, validação no __post_init__, métodos próprios e a escolha entre mutável e imutável. A namedtuple é mais enxuta e continua sendo uma tupla, o que a torna leve e compatível com código que espera tuplas. Para um registro simples e imutável, a namedtuple basta; quando surge a necessidade de comportamento, a dataclass leva vantagem.

Quando um dict ou uma tupla já basta

Nem todo dado precisa de uma classe. Um dicionário é imbatível quando o conjunto de chaves não é fixo, quando você recebe dados de fora com forma variável ou quando quer montar e desmontar estruturas de forma dinâmica. Uma tupla simples é perfeita para um par ou trio efêmero, como devolver dois valores de uma função. O custo do dicionário é não ter estrutura garantida: nada impede uma chave escrita errada. O custo da tupla é não ter nomes: você acessa por posição e precisa lembrar a ordem.

EstruturaPontos fortesQuando escolher
dataclassMétodos, padrões, validação, frozen opcionalModelo de dados com regras e comportamento
namedtupleImutável, leve, nomes, ainda é tuplaRegistro pequeno e fixo, sem métodos
dictFlexível, chaves dinâmicasDados de forma variável ou vindos de fora
tuplaMínima, rápida, imutávelPar ou trio efêmero, retorno múltiplo

Cada estrutura tem seu lugar; a escolha depende do problema.

Um sinal prático: se você se vê acessando sempre as mesmas chaves de um dicionário e tomando cuidado para não errar o nome, é hora de promover aquilo a uma dataclass ou namedtuple, que dão estrutura e verificação. No sentido oposto, se você criou uma dataclass elaborada para guardar um par de números que aparece uma vez só, uma tupla teria bastado. A boa engenharia é casar a estrutura com a necessidade real, sem exagerar para nenhum dos lados.

Um critério simples de escolha

Vale guardar um roteiro mental. Precisa de métodos, valores padrão ou validação? Dataclass. Quer só um registro pequeno, imutável, com nomes e sem comportamento? Namedtuple. As chaves variam ou os dados vêm de fora com forma incerta? Dicionário. É um agrupamento efêmero de poucos valores, como um retorno múltiplo? Tupla. Esse roteiro cobre a esmagadora maioria dos casos e evita as duas armadilhas comuns: usar dicionário para tudo, perdendo estrutura, e criar classe para tudo, ganhando peso desnecessário.

Sinais de que falta estrutura

  • Acessar sempre as mesmas chaves de um dict
  • Medo de digitar uma chave errada
  • Repetir a mesma forma de dado em vários lugares
  • Precisar validar o mesmo dicionário toda vez

Sinais de que sobra estrutura

  • Uma classe elaborada para um par de números
  • Métodos que nunca são usados
  • Um objeto de vida curta que aparece uma vez
  • Herança e camadas para um dado trivial

No fim, escolher a estrutura de dados certa é uma das decisões mais rotineiras e importantes de quem programa em Python. As dataclasses tornaram a opção estruturada muito mais barata de escrever, então hoje há menos desculpa para amontoar tudo em dicionários. Ainda assim, dicionário e tupla continuam certíssimos nos seus lugares. Com esse critério em mãos e o Enum da próxima aula para constantes nomeadas, você fecha o repertório de modelagem de dados do módulo.

Teste rápido

Qual estrutura é a melhor para um registro pequeno, imutável, com campos nomeados e sem métodos?

Perguntas frequentes

A namedtuple é mais rápida que a dataclass?
Para operações de tupla, a namedtuple é bem leve e eficiente, por ser uma tupla de fato. A dataclass é um objeto comum, um pouco mais pesado, mas em troca oferece métodos, validação e flexibilidade. Na maioria dos programas a diferença é irrelevante; escolha pela necessidade, não pela microotimização.
Posso adicionar métodos a uma namedtuple?
É possível com uma forma baseada em classe, herdando de NamedTuple do módulo typing, que permite anotar tipos e incluir métodos. Ainda assim, quando você precisa de comportamento e regras, a dataclass costuma ser mais natural e legível. A namedtuple brilha mesmo é no registro simples e imutável.
Quando um dicionário é melhor que uma dataclass?
Quando as chaves não são fixas, quando os dados chegam de fora com forma variável, ou quando você monta estruturas dinamicamente. O dicionário é flexível justamente por não impor forma. O custo é a falta de garantia estrutural, então prefira-o quando essa flexibilidade for realmente necessária.
Tupla e namedtuple são intercambiáveis?
A namedtuple é uma tupla, então funciona em todo lugar que espera uma tupla, com o bônus dos nomes. O caminho inverso não vale: uma tupla comum não tem os nomes de campo. Use a namedtuple quando quiser os nomes sem perder a compatibilidade com código que trabalha com tuplas.
Há um jeito rápido de transformar uma dataclass em dicionário?
Sim. O módulo dataclasses traz uma função que converte a instância num dicionário com os campos, útil para serializar ou inspecionar. Assim você tem estrutura e verificação ao trabalhar com o objeto e, quando precisa de um dicionário, gera um sob demanda. A documentação oficial mostra o uso.
Usar dicionário para tudo é um erro?
Não é erro, mas costuma ser um sinal de estrutura faltando. Se você acessa sempre as mesmas chaves e teme digitá-las errado, uma dataclass ou namedtuple dá nomes verificáveis e documenta a forma do dado. Reserve o dicionário para quando a flexibilidade de chaves for mesmo necessária.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.