Compreender o conceito
Dados de CSV e APIs precisam de validação de esquema, valores e regras. Converter texto não prova validade funcional. Para aritmética decimal exata, Decimal construído a partir de texto evita importar a aproximação de um float. A regra de arredondamento e escala continua a precisar de definição explícita.
Aplicar e decidir
Um datetime sem fuso não identifica por si só um instante universal. Usa datas conscientes do fuso para eventos e preserva a data de negócio separadamente quando necessário. Mudanças de hora podem criar horas locais repetidas ou inexistentes. Ordenar strings com offsets diferentes não é uma estratégia geral segura para ordenar instantes.
Aplicação guiada no trabalho
Num ficheiro de cobranças fictício, a regra exige montantes finitos, não negativos e com duas casas decimais. Constrói Decimal a partir do texto original, sem passagem por float. Verifica is_finite antes de comparar limites: NaN pode ser representável sem ser um montante válido. Se o contrato permitir arredondamento, explicita o modo e a escala; quantize com ROUND_HALF_UP não é a mesma regra que HALF_EVEN. Se o contrato rejeitar casas adicionais, não as arredondes silenciosamente. Para timestamps, preserva offset ou fuso e informação que desambigue uma hora repetida. fold distingue ocorrências conhecidas, mas não descobre qual ocorreu. Converter um instante para UTC é diferente de acrescentar um rótulo UTC a uma hora local sem contexto.
Finitude antes das regras do montante
Construir Decimal a partir de texto não garante um montante finito. NaN e Infinity são representáveis e precisam de rejeição quando o domínio os proíbe. Usa is_finite antes das regras de escala, sinal e limites; decide ainda a política de arredondamento. Um token JSON e uma string contendo NaN atravessam caminhos de parsing diferentes. Não assumas que a configuração do decoder substitui a validação do campo.
Duração e instante usam referências diferentes
Usa diferenças de time.monotonic para orçamentos locais que não devem recuar quando a hora civil é ajustada. Não guardes o seu valor absoluto como timestamp UTC. Para relacionar instantes entre sistemas, conserva datas com offset e converte corretamente. No mesmo dia, 09:00 com offset +01:00 corresponde a 08:00 UTC, uma hora antes de 09:00 UTC. astimezone converte a representação preservando o instante; substituir apenas tzinfo pode mudar a interpretação do valor.
from decimal import Decimal
from datetime import datetime, timezone
amount = Decimal("0.1") + Decimal("0.2")
observed_at = datetime.now(timezone.utc)Decimal("0.1") + Decimal("0.2") representa exatamente 0.3. Um evento pode ser armazenado em UTC e apresentado em Europe/Lisbon.
Armadilhas comuns
Construir Decimal a partir de float; aceitar NaN; escolher fold sem evidência.
Tópicos relacionados: Automação observável e repetível · Dados, tipos e decisões
Precisão numérica, validade do dado e interpretação temporal são decisões explícitas.
Referência: Python 3.14: Decimal arithmetic · Python 3.14; DR Python 2026.3