HOWTO · Python

Constantes em Python

Aprenda a definir constantes Python com nomes UPPER_CASE, agrupar valores relacionados e usar Enum para conjuntos fixos.

Nesta página

Python não possui uma declaração const que torne um nome permanentemente somente leitura. A solução comum é definir um nome no nível do módulo usando UPPER_CASE e tratar a reatribuição como um erro de revisão de código. Use uma classe para agrupar valores ou Enum quando eles formarem um conjunto fixo de membros nomeados.

Definir constantes de módulo com nomes UPPER_CASE

Coloque valores compartilhados por um módulo ou pacote perto do início e escreva seus nomes em maiúsculas com sublinhados. Outros módulos podem importar o nome normalmente. A convenção comunica a intenção, mas Python ainda permite religar o nome.

TIMEOUT_SECONDS = 30
SUPPORTED_FORMATS = ("json", "toml")

print(TIMEOUT_SECONDS)
TIMEOUT_SECONDS = 60  # Legal Python, but a reassignment of a constant by convention.
print(TIMEOUT_SECONDS)

Saída:

30
60

A tupla impede alterações naquele objeto, mas não torna o nome do módulo imutável: SUPPORTED_FORMATS ainda pode ser religado. Um valor mutável, como uma lista, também pode ser alterado no local. Prefira valores imutáveis quando possível e mantenha no módulo as constantes que fazem parte da configuração ou API pública.

Agrupar valores relacionados com uma classe

Uma classe fornece um namespace legível para valores relacionados, acessados como Settings.DEFAULT_TIMEOUT. Isso ajuda na organização, mas um atributo de classe comum não é uma constante imposta pela linguagem. A classe e normalmente suas instâncias podem ser modificadas.

class Settings:
    DEFAULT_TIMEOUT = 30
    RETRY_LIMIT = 3


print(Settings.DEFAULT_TIMEOUT)
Settings.DEFAULT_TIMEOUT = 60
print(Settings.DEFAULT_TIMEOUT)

Saída:

30
60

Descritores personalizados ou metaclasses podem rejeitar atribuições, mas aumentam a complexidade e exigem cuidado com atributos de instância, subclasses e outros caminhos de mutação. Use uma classe normal como namespace, salvo quando houver um requisito explícito e testado de imposição.

Usar Enum para um conjunto fixo de valores nomeados

Use o módulo enum da biblioteca padrão quando um valor precisar ser um membro definido. Um membro Enum é acessado pela classe e atribuir um novo valor gera uma exceção. Enum é melhor que uma variável em maiúsculas quando o conjunto tem significado de domínio, como estados, cores ou modos.

from enum import Enum


class Color(Enum):
    RED = "red"
    BLUE = "blue"


print(Color.RED.value)
try:
    Color.RED = "green"
except AttributeError as error:
    print(type(error).__name__)

Saída:

red
AttributeError

Enum não torna todos os valores do programa imutáveis e não é intercambiável com as strings originais. Use Color.RED quando a identidade do membro importar, ou Color.RED.value quando uma API exigir o valor subjacente. Para ler entrada externa, construa o enum com Color("red"); um valor desconhecido gera ValueError para tratamento explícito.

Considerar namedtuple e funções como alternativas

A técnica antiga collections.namedtuple() pode agrupar campos imutáveis. Constants = namedtuple("Constants", "PI E") seguido de values = Constants(3.14159, 2.71828) cria uma tupla cujos campos não podem receber atribuições. Ela ainda permite religar values e é menos expressiva que Enum para escolhas nomeadas.

Uma função que retorna um valor pode ocultar sua construção ou calculá-lo sob demanda, mas não é uma declaração de constante. Por exemplo, def api_version(): return "v1" comunica um acessador, não uma ligação imutável. Prefira um nome de módulo para uma constante simples, uma classe para agrupamento e Enum para um conjunto fechado.

Escolher e verificar o padrão

Use nomes de módulo UPPER_CASE para valores compartilhados, uma classe quando um namespace melhorar a organização e Enum para um conjunto de domínio fixo. Declare claramente o limite de mutação: nomes comuns e atributos de classe podem ser religados, enquanto membros de enum rejeitam reatribuição. Os exemplos verificam acesso bem-sucedido e o comportamento importante de falha ou reatribuição. Revisões, testes e APIs claras continuam necessários.

Resumo

Python não fornece uma palavra-chave const integrada. Defina constantes comuns com nomes de módulo UPPER_CASE, agrupe constantes relacionadas com uma classe quando útil e escolha Enum quando os chamadores devam usar um entre vários membros nomeados. Trate namedtuple() e acessadores de função como alternativas especializadas, não como constantes impostas.