Python Glossary English

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Сообщить о неточности