Python ya tiene un valor centinela nativo para acabar con la ambigüedad de None

Much Ado About None: Sentinel Values in Python

None en Python sirve para todo: indicar que falta un valor, que hubo un error o que el valor es realmente None. Esa ambigüedad provoca errores sutiles en cachés, configuraciones y funciones. Los centinelas resuelven el problema al quedar fuera del dominio de valores válidos. Python ya usaba Ellipsis y NotImplemented, y Pydantic tiene MISSING. Tras años de debate, el PEP 661 fue aceptado y desde Python 3.15 existe sentinel como función integrada, con soporte para type checkers.

Mi principal conclusión: sé consciente de la ambigüedad de None y piensa en qué quieres expresar realmente.
  1. pwdisswordfishq

    Tanto lío para evitar introducir la mónada opcional.

  2. lpghatguy

    Cuando escribía mucho Lua, era un gran fan de tener un valor centinela None (Lua usa 'nil' para representar la ausencia) y era útil para muchas cosas similares al MISSING de Pydantic.

    Esta distinción es algo que creo que es realmente práctico de JavaScript, y distinguir entre 'null' y 'undefined' a veces es útil por razones similares.

  3. RantyDave

    "Una caché simple devuelve None tanto para una clave ausente como para una clave que se asigna a None."

    No, devuelve KeyError. O al menos debería.

  4. est

    Yo simplemente devuelvo un tipo de Exception personalizado. Funciona más o menos igual.

  5. throwaway2037

    Aquí está el código de ejemplo del artículo:

    > MISSING = sentinel("MISSING")

    > def update_email(user_id: int, email: str | None | MISSING = MISSING) -> None:

    > if email is MISSING:

    > return # nothing to update

    > elif email is None:

    > db.delete_email(user_id)

    > else:

    > db.set_email(user_id, email.lower()) # narrowed to str

    Veo este estilo frecuentemente en programadores de Python veteranos. El lenguaje es tan dinámico que la gente empieza a pensar que esta es una buena forma de programar. Opinión impopular: no lo es. ¿Por qué no dos funciones diferentes llamadas delete_email() y set_email()? Eso sería más claro.

Más de este día

2026-10-31