TGViewer
Находки в опенсорсе Находки в опенсорсе @opensource_findings · 12.6K subscribers
Post #960 10.3K
PEP-661: sentinel объекты

PEP: https://peps.python.org/pep-0661/
Код: https://github.com/python/cpython/pull/148831
Обсуждение: https://discuss.python.org/t/pep-661-sentinel-values/9126

В питон 3.15 добавляют новый builtinsentinel, чтобы создавать значения по-умолчанию.
Проблема достаточно понятная, например: нам нужно создать какое-то значение по-умолчанию, чтобы мы знали, что аргумент не был передан. Но None является валидным значением в нашей логике. Потому нужно создать новое особое "пустое" значение.

Данная логика встречается буквально везде:
dataclasses
django_modern_rest
msgspec (тоже самое но на C)

Однако, теперь можно упростить АПИ для создания таких объектов до:


_SENTINEL_VALUE = sentinel('_SENTINEL_VALUE')


А вот пример PR, где в dataclasses уже используют новое АПИ: https://github.com/python/cpython/commit/16952218d0535904236e8a39851133688c9ce1f0

Как оно примерно внутри устроено

Как и все билтины, sentinel написан на C, его исходники вот тут: https://github.com/python/cpython/blob/main/Objects/sentinelobject.c

Но я приведу примерную версию на питоне (из PEP), чтобы было понятнее, как он работает внутри:


class sentinel:
__slots__ = ("__name__", "_module_name")

def __init_subclass__(cls):
raise TypeError("type 'sentinel' is not an acceptable base type")

def __init__(self, name, /):
if not isinstance(name, str):
raise TypeError("sentinel name must be a string")
self.__name__ = name
self._module_name = sys._getframemodulename(1)

@property
def __module__(self):
return self._module_name

def __repr__(self):
return self.__name__

def __reduce__(self):
return self.__name__

def __copy__(self):
return self

def __deepcopy__(self, memo):
return self

def __or__(self, other):
return typing.Union[self, other]


Хороший пример синглтона ^

Что здесь важно?

1. pickle должен корректно работать, для того имя sentinel('NAME') должно совпадать с именем объекта на уровне модуля: NAME =
2. Объект должны быть внешне иммутабельным
3. Копирование объекта должно возвращать тот же самый синглтон

Не только для Питона

Ну и конечно же: есть две новые функции в C-API для создания таких объектов в C-extensions (как msgspec например):
PyObject *PySentinel_New(const char *name, const char *module_name) для создания
bool PySentinel_Check(PyObject *obj) для проверки

Вот такая фича. Довольно просто, закрывает понятную проблему. Но не очень ясно, почему builtin.

Обсуждение: Приходилось ли пользоваться чем-то подобным? Какую реализацию синглтона в питоне вы считаете лучшей? Согласны с добавлением нового builtin?

| Поддержать | YouTube | GitHub | Чат |
Python Enhancement Proposals (PEPs) PEP 661 – Sentinel Values | peps.python.org Unique placeholder values, commonly known as “sentinel values”, are common in programming. They have many uses, such as for:
  • 👍 57
  • ❤ 8
  • 🔥 8
  • 🤔 2
  • 😁 1
  • 🤯 1
More from @opensource_findings
  1. Sep 15, 2026PEPы в Python окончательно вышли из-под контроля Давайте посмотрим, что происходит с ПЕПам…
  2. Sep 10, 2026Большая бесплатная конференция в Нижнем Новгороде 17 октября Регистрация: https://itgorky.…
  3. Sep 1, 2026Post #985
  4. Aug 24, 2026JIT могут удалить из CPython! PEP-836: https://peps.python.org/pep-0836 JIT в CPython имее…
  5. Aug 18, 2026Как AWS у опенсорсера пакеты отжимал Нерегулярная рубрика "посмотрите, что творится!". Дан…
  6. Aug 14, 2026Какие уникальные фичи есть в django-modern-rest? Иногда, когда я добавляю какие-то фичи в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →