Sobes.tech
Middle

Quais são as semelhanças e diferenças entre dataclasses e namedtuple?

sobes.tech IA

Resposta da IA

dataclasses e namedtuple são usados para criar estruturas de dados simples, onde o objetivo principal é armazenar dados e acessá-los pelo nome.

Semelhanças:

  • Permitem criar classes com campos claramente definidos.
  • Fornecem acesso aos campos pelo nome (por exemplo, obj.field).
  • Geram automaticamente métodos __repr__ (para uma representação de string conveniente).
  • Suportam desempacotamento.

Diferenças:

Diferença collections.namedtuple dataclasses.dataclass
Mutabilidade Tipo imutável (immutable) Por padrão mutável, pode ser tornado imutável (frozen=True)
Tipagem Opcional, baseada em anotações de tipos Obrigatória, baseada em anotações de tipos
Herança Baseado em tupla, difícil de estender Classes completas, suportam herança
Funcionalidade Apenas armazenamento de dados, repr simples Mais funcionalidades: __init__, __eq__, __hash__, __order__, campos com valores padrão, pós-processamento (__post_init__)
Versão do Python Disponível no Python 2 e 3 Disponível a partir do Python 3.7
Sintaxe Função que retorna uma classe Decorador @dataclass

Exemplos:

# namedtuple
from collections import namedtuple

PointNT = namedtuple('PointNT', ['x', 'y'])
p1 = PointNT(1, 2)
# p1.x = 10 # Causará erro, pois é imutável

print(p1)
# dataclass
from dataclasses import dataclass, field

@dataclass
class PointDC:
    x: int
    y: int = 0 # Campo com valor padrão
    z: int = field(init=False) # Campo não inicializado automaticamente

    def __post_init__(self):
        self.z = self.x + self.y

p2 = PointDC(1)
print(p2)

p2.y = 5 # Mutável por padrão
print(p2)

# Para criar um dataclass imutável
@dataclass(frozen=True)
class ImmutablePoint:
    x: int
    y: int

p3 = ImmutablePoint(3, 4)
# p3.x = 10 # Causará erro
print(p3)