Python 3.15+Встроенные функциипонятие
sentinel()
объекты
Создаёт уникальный объект-маркер с понятным repr — например, «значение не передано», когда None само является допустимым значением.
Синтаксис
sentinel(name, /, *, repr=None)
Классическая замена — MISSING = object(): уникально, но в отладке печатается как <object object at 0x7f...>, не копируется по смыслу и не годится в аннотацию. sentinel('MISSING') печатается как MISSING, переживает copy и deepcopy (возвращается тот же объект), сериализуется pickle, если лежит в модуле под тем же именем, и может стоять в аннотации: int | MISSING. Сравнивают его через is, а не ==; он всегда истинен, поэтому проверка if value: его не отличит — нужно if value is MISSING. Наследоваться от sentinel нельзя. Имя переменной принято совпадать с именем маркера.
Примеры
MISSING = sentinel('MISSING')
def get(d, key, default=MISSING):
if key in d:
return d[key]
if default is MISSING:
raise KeyError(key)
return default
print(get({'a': None}, 'a')) # → None — None здесь законное значение
print(get({}, 'b', 0)) # → 0
print(MISSING) # → MISSING
import copy
MISSING = sentinel('MISSING')
print(copy.deepcopy(MISSING) is MISSING) # → True
print(bool(MISSING)) # → True — проверяйте через is, а не через if
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности