Yeda AI Tips · #105

English

Nunca conviertas una variable de entorno a bool con un cast

Este bug de configuración de una sola línea enciende tu kill switch. Las variables de entorno siempre son strings, y en casi todos los lenguajes un string no vacío es "truthy" — así que bool(os.environ["KILL_SWITCH"]) devuelve True sin importar si el operador escribió "true", "false" o "0". La bandera que construiste para detener el sistema acaba de convertirse en una bandera que no puede decir que no.

Por qué el cast directo miente

La regla de verdad de Python se trata de vacío, no de significado: un objeto es verdadero salvo que sea uno de los valores falsy documentados — None, False, cero numérico o una colección vacía como ''. El string "false" tiene cinco caracteres, así que es truthy. La misma trampa existe en todo el stack:

Hay exactamente dos valores de string que un cast directo maneja bien: no definido y vacío. Todo lo que un operador escribiría en la práctica — true, false, 1, 0, yes, no — se interpreta mal o solo a medias.

Parsea con un vocabulario compartido

La solución es un único parser con un vocabulario explícito de true/false, usado tanto para variables de entorno como para configuración estructurada, de modo que false signifique false en todas partes:

_TRUE  = {"1", "true", "t", "yes", "y", "on"}
_FALSE = {"0", "false", "f", "no", "n", "off"}

def env_bool(name: str, default: bool = False) -> bool:
    raw = os.environ.get(name)
    if raw is None or raw.strip() == "":
        return default          # blank template value != forced off
    v = raw.strip().lower()
    if v in _TRUE:
        return True
    if v in _FALSE:
        return False
    raise ValueError(f"{name}={raw!r} is not a boolean")

Tres propiedades importan más que la lista exacta de palabras:

PropiedadPor qué importa
Sin definir/en blanco → defaultUna línea FLAG= vacía en una plantilla .env no debería forzar la bandera a off (ni a on)
Valor desconocido → errorFLAG=fales debería fallar al arrancar, no elegir un lado en silencio
Un vocabulario en todas partesEnv vars, YAML y flags de CLI deben coincidir en qué significa "false"

La última fila es la sutil. Si tu parser de entorno acepta yes pero tu loader de YAML no, el mismo valor de despliegue cambia de significado según dónde esté escrito.

Referencias previas: qué aceptan los parsers reales

La metodología twelve-factor lleva la configuración a variables de entorno precisamente porque son un estándar agnóstico de lenguaje y de sistema operativo — lo que también implica que solo pueden transportar strings. La disciplina de tipos es tu trabajo.

Notas para usuarios avanzados

Recursos

Este artículo acompaña al reel #105 de la serie Yeda AI Tips. ¿Construyendo un flujo de ingeniería asistido por IA? Yeda AI diseña, audita y entrega sistemas LLM de producción.

Habla con nosotros · Lee el blog · Read in English