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:
Finalnão impede reatribuição em runtime- Ferramentas como
mypyacusam 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
Finalpara reforçar intenção em projetos tipados - Use
Enumpara conjuntos fechados de valores - Prefira objetos imutáveis quando necessário