En Python, 'None' se utiliza frecuentemente como una 'navaja suiza' para indicar que falta un valor, que ocurrió un error o que una configuración no está establecida. Sin embargo, esta versatilidad crea ambigüedad semántica. Por ejemplo, en un sistema de caché, un valor de retorno de 'None' podría significar que una clave falta en el diccionario o que la clave existe pero está explícitamente mapeada a 'None'. Del mismo modo, en las actualizaciones de configuración, un parámetro 'timeout=None' podría interpretarse como 'sin tiempo de espera' o 'mantener el valor existente', dependiendo de la implementación. Para resolver estas colisiones, los desarrolladores pueden utilizar valores centinela: objetos únicos que existen fuera del dominio de los datos válidos, asegurando que nunca se solapen con los valores reales.

La biblioteca estándar de Python ya utiliza varios centinelas integrados para gestionar comportamientos complejos. El objeto 'Ellipsis' (...) se utiliza para omitir dimensiones en el fragmentado de NumPy, mientras que 'NotImplemented' sirve como una señal para buscar una implementación en otro lugar, permitiendo el 'doble despacho' para operadores binarios. Más recientemente, la biblioteca Pydantic introdujo un centinela 'MISSING' para distinguir los campos que nunca se enviaron de aquellos establecidos explícitamente como nulos. Históricamente, los desarrolladores creaban centinelas personalizados usando 'object()', pero este enfoque a menudo rompía el estrechamiento de tipos estáticos en herramientas como MyPy. Aunque los rodeos como las cadenas 'Literal' o trucos con 'Enum' eran comunes, a menudo conllevaban desventajas con respecto a las comprobaciones de identidad o la serialización con pickle.

Con la aceptación de PEP 661, Python 3.15 introdujo un 'sentinel' integrado dedicado para estandarizar este patrón. Esto permite a los comprobadores de tipos estrechar tipos de la misma manera que lo hacen con 'None'. Por ejemplo, una función ahora puede verificar si un parámetro es exactamente el valor 'sentinel' para determinar si se debe omitir una acción, permitiendo al mismo tiempo que 'None' represente un estado 'vacío' válido. Si bien el nuevo valor integrado proporciona un camino más limpio para el diseño de API, los desarrolladores en versiones anteriores pueden usar 'typing_extensions' para un portado. El cambio hacia centinelas formales destaca un movimiento hacia una semántica más precisa en Python, alejándose del uso sobrecargado de 'None' hacia representaciones explícitas y seguras en cuanto a tipos de la ausencia.