Python обзавёлся встроенным sentinel: PEP 661 принят после многолетних споров

Much Ado About None: Sentinel Values in Python

None в Python перегружен: им обозначают и отсутствие значения, и ошибку, и реальное значение. Это порождает путаницу — например, кэш возвращает None и для отсутствующего ключа, и для ключа со значением None. Sentinel-значения решают проблему, находясь вне домена допустимых значений. Python давно использует их неявно (Ellipsis, NotImplemented), а с версии 3.15 появился встроенный sentinel, который type checker'ы сужают так же, как None. Автор рассказывает, как пришёл к этому на конференциях PyConDE, EuroPython и Swiss Python Summit.

Мой главный вывод: осознавайте неоднозначность None и думайте о том, что вы на самом деле хотите выразить.
  1. pwdisswordfishq

    Столько усилий, лишь бы не вводить optional-монаду.

  2. lpghatguy

    Когда я много писал на Lua, я был большим поклонником наличия sentinel-значения None (в Lua для обозначения отсутствия используется 'nil'), и это было полезно во многих вещах, похожих на MISSING в Pydantic.

    Это различие — то, что, на мой взгляд, действительно удобно в JavaScript, и различение 'null' и 'undefined' иногда бывает полезно по похожим причинам.

  3. RantyDave

    «Простой кэш возвращает None и для отсутствующего ключа, и для ключа, который отображается в None.»

    Нет, он возвращает KeyError. Или, по крайней мере, должен.

  4. est

    Я просто возвращаю кастомный тип Exception. Работает примерно так же.

  5. chowells

    Мне нравится. Не вижу, как сделать лучше, оставаясь совместимым с идиомами Python.

Ещё за этот день

2026-10-31