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.
- pwdisswordfishq
Tanto lío para evitar introducir la mónada opcional.
- 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.
- 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.
- est
Yo simplemente devuelvo un tipo de Exception personalizado. Funciona más o menos igual.
- 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.