Skip to main content

Constantes | Python

  • Constantes | Python

Definição

Em Python, não existe suporte nativo a constantes imutáveis em nível de linguagem como em C (const) ou Java (final).

Por convenção, uma constante é representada por uma variável cujo valor não deve ser alterado após a definição.

A prática adotada é:

  • Nome em UPPER_CASE
  • Definição em nível de módulo
  • Não reatribuir após declaração

Exemplo:

PI = 3.14159
MAX_TENTATIVAS = 5
URL_BASE = "https://api.exemplo.com"

Convenção Oficial (PEP 8)

Segundo a PEP 8:

Constantes devem ser escritas em letras maiúsculas, com palavras separadas por underscore.

TAXA_JUROS = 0.05
TIMEOUT_PADRAO = 30

⚠️ Essa regra é apenas convenção. O Python não impede reatribuição.


Reatribuição Ainda é Possível

Mesmo sendo constante por convenção, o valor pode ser alterado:

MAX_USUARIOS = 100

MAX_USUARIOS = 200 # permitido

O interpretador não gera erro.


Simulando Constantes com typing.Final

A partir do Python 3.8, é possível usar Final do módulo typing para indicar que uma variável não deve ser reatribuída.

from typing import Final

API_VERSION: Final = "v1"
TIMEOUT: Final[int] = 30

Observação:

  • Final não impede reatribuição em runtime
  • Ferramentas como mypy acusam erro estático

Exemplo de erro em análise estática:

API_VERSION = "v2"  # mypy sinaliza erro

Constantes em Módulos

Uma prática comum é criar um módulo exclusivo para constantes.

Estrutura:

projeto/
├── main.py
└── constants.py

constants.py

DATABASE_URL = "postgres://localhost"
MAX_RETRIES = 3
DEBUG_MODE = False

main.py

from constants import MAX_RETRIES

print(MAX_RETRIES)

Isso centraliza configurações e melhora manutenção.


Constantes Imutáveis com Dataclass

Outra abordagem é usar objetos imutáveis:

from dataclasses import dataclass

@dataclass(frozen=True)
class Config:
TIMEOUT: int = 30
RETRIES: int = 5

config = Config()

Com frozen=True:

  • A instância se torna imutável
  • A tentativa de alteração gera erro
config.TIMEOUT = 60  # TypeError

Constantes com Enum

Quando os valores representam um conjunto fixo de opções, Enum é mais adequado.

from enum import Enum

class Status(Enum):
ATIVO = "ativo"
INATIVO = "inativo"
BLOQUEADO = "bloqueado"

Uso:

if usuario.status == Status.ATIVO:
...

Vantagens:

  • Tipagem forte
  • Prevenção contra valores inválidos
  • Melhor semântica

Diferença entre Constante e Imutabilidade

Constante refere-se à intenção de não reatribuir a variável.

Imutabilidade refere-se ao objeto não poder ser modificado internamente.

Exemplo:

LISTA = [1, 2, 3]

LISTA.append(4) # permitido

A variável não foi reatribuída, mas o objeto foi alterado.

Para imutabilidade real:

TUPLA = (1, 2, 3)

Boas Práticas

  • Use UPPER_CASE para constantes
  • Defina constantes no topo do módulo
  • Centralize constantes globais em arquivo dedicado
  • Use Final para reforçar intenção em projetos tipados
  • Use Enum para conjuntos fechados de valores
  • Prefira objetos imutáveis quando necessário