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 и думайте о том, что вы на самом деле хотите выразить.
- pwdisswordfishq
Столько усилий, лишь бы не вводить optional-монаду.
- lpghatguy
Когда я много писал на Lua, я был большим поклонником наличия sentinel-значения None (в Lua для обозначения отсутствия используется 'nil'), и это было полезно во многих вещах, похожих на MISSING в Pydantic.
Это различие — то, что, на мой взгляд, действительно удобно в JavaScript, и различение 'null' и 'undefined' иногда бывает полезно по похожим причинам.
- RantyDave
«Простой кэш возвращает None и для отсутствующего ключа, и для ключа, который отображается в None.»
Нет, он возвращает KeyError. Или, по крайней мере, должен.
- est
Я просто возвращаю кастомный тип Exception. Работает примерно так же.
- chowells
Мне нравится. Не вижу, как сделать лучше, оставаясь совместимым с идиомами Python.