HOWTO · Python
Constantes en Python
Aprende a definir constantes de Python con nombres UPPER_CASE, agrupar valores relacionados y usar Enum para conjuntos fijos.
En esta página
Python no tiene una declaración const que haga que un nombre sea permanentemente de solo lectura. La solución habitual es definir un nombre de nivel de módulo con la escritura UPPER_CASE y tratar la reasignación como un error de revisión de código. Usa una clase para agrupar valores relacionados o Enum cuando los valores formen un conjunto fijo de miembros con nombre.
Definir constantes de módulo con nombres UPPER_CASE
Coloca los valores compartidos por un módulo o paquete cerca del inicio del módulo y escribe sus nombres en mayúsculas con guiones bajos. Otros módulos pueden importar el nombre normalmente. Esta convención comunica la intención, pero Python aún permite reasignar el nombre.
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)
Salida:
30
60
La tupla evita cambios en ese objeto de tupla concreto, pero no hace inmutable el nombre del módulo: SUPPORTED_FORMATS aún puede reasignarse. Del mismo modo, un valor mutable como una lista puede cambiarse directamente. Elige valores inmutables cuando sea posible y mantén las constantes en un módulo si forman parte de su configuración o API pública.
Agrupar valores relacionados con una clase
Una clase puede ofrecer un espacio de nombres legible para valores relacionados, accesible como Settings.DEFAULT_TIMEOUT. Esto ayuda a organizar, pero un atributo de clase normal no es una constante impuesta por el lenguaje. Tanto la clase como (normalmente) sus instancias pueden modificarse.
class Settings:
DEFAULT_TIMEOUT = 30
RETRY_LIMIT = 3
print(Settings.DEFAULT_TIMEOUT)
Settings.DEFAULT_TIMEOUT = 60
print(Settings.DEFAULT_TIMEOUT)
Salida:
30
60
Los descriptores personalizados o las metaclases pueden rechazar ciertas asignaciones, pero añaden complejidad y requieren tratar con cuidado los atributos de instancia, la herencia y otras vías de mutación. No uses una clase normal solo porque parezca impedir la reasignación; úsala como espacio de nombres salvo que necesites una restricción explícita y probada.
Usar Enum para un conjunto fijo de valores con nombre
Usa el módulo enum de la biblioteca estándar cuando un valor deba ser uno de varios miembros definidos. Un miembro de Enum se obtiene mediante la clase y asignarle un nuevo valor produce una excepción. Enum encaja mejor que una variable en mayúsculas cuando el conjunto tiene significado de dominio, como estados, colores o 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__)
Salida:
red
AttributeError
Enum no hace inmutable cada valor del programa y no es intercambiable con los valores de cadena sin formato. Usa Color.RED cuando importe la identidad del miembro o Color.RED.value cuando una API necesite el valor subyacente. Para analizar entrada externa, construye el enum con Color("red"); un valor desconocido produce ValueError.
Considerar namedtuples y funciones como alternativas
La técnica antigua collections.namedtuple() puede agrupar campos inmutables: Constants = namedtuple("Constants", "PI E") seguido de values = Constants(3.14159, 2.71828) crea una tupla cuyos campos no pueden asignarse. Sigue siendo útil cuando los datos deben comportarse como un registro ligero, pero es menos expresiva que Enum para opciones con nombre.
Una función que devuelve un valor puede ocultar la construcción o calcularlo bajo demanda, pero no es una declaración de constante. Por ejemplo, def api_version(): return "v1" comunica un acceso, no una vinculación inmutable. Prefiere un nombre de módulo para una constante simple, una clase para agrupar y Enum para un conjunto cerrado de miembros relacionados.
Elegir y verificar el patrón
Usa nombres de módulo UPPER_CASE para valores compartidos normales, una clase cuando un espacio de nombres mejore la organización y Enum para un conjunto de dominio fijo. Explica siempre el límite de mutación: los nombres normales y los atributos de clase pueden reasignarse, mientras que los miembros de Enum rechazan la reasignación. Los ejemplos verifican tanto el acceso correcto como el comportamiento de error. Las revisiones, las pruebas y las API claras siguen siendo parte de aplicar un diseño constante.
Resumen
Python no ofrece una palabra clave integrada const. Define constantes normales con nombres de módulo UPPER_CASE, agrupa las relacionadas con una clase cuando sea útil y elige Enum cuando los consumidores deban usar uno de varios miembros con nombre. Trata namedtuple() y las funciones de acceso como alternativas especializadas, no como constantes impuestas.