Python 告别 None 歧义:sentinel 来了
Much Ado About None: Sentinel Values in Python
None 在 Python 中常被滥用,既表示缺失、未设置,又代表错误或实际值,导致逻辑歧义。我在 PyConDE、EuroPython 和 Swiss Python Summit 的演讲中深入探讨了这一问题,并介绍了 Sentinel 值如何作为域外守卫值解决冲突。Python 3.15 已内置 sentinel 函数,配合 typing_extensions 可向后兼容,让类型检查器能精准区分 MISSING 与 None。别再依赖 object() 或 Enum 技巧,拥抱新标准,让代码意图更清晰。
Sentinel 值之所以有效,是因为它们作为域外守卫值,永远不可能与真实值发生冲突。
HN 评论区
28- est
我通常直接抛出一个自定义的 Exception 类型。效果差不多。
- pwdisswordfishq
费了这么大劲,就为了避而不谈 optional monad。
- lpghatguy
当初我写了一大堆 Lua 时,非常推崇使用 None 作为哨兵值(Lua 用 'nil' 表示缺失),这在很多场景下都非常有用,类似于 Pydantic 的 MISSING。
这种区分我觉得其实是 JavaScript 的一个实用特性,出于类似原因,区分 'null' 和 'undefined' 有时也很有用。