TwKit
正在载入
TwKit

在 Python 接口设计里,None 常被用来表示“没传”“清空”或“出错”。一旦 None 本身也是合法值,这几种意思就混在一起了。 哨兵值的作用,是给… · @BaiBtw · TwKit

@BaiBtw

在 Python 接口设计里,None 常被用来表示“没传”“清空”或“出错”。一旦 None 本身也是合法值,这几种意思就混在一起了。 哨兵值的作用,是给“缺失”一个不会与正常数据冲突的标记。比如更新邮箱,可以明确分成三种情况: • 未传参数,保持原样。 • 显式传 None,删除邮箱。 • 传字符串,更新邮箱。 Python 3.15 新增内置 sentinel,可用 MISSING = sentinel("MISSING") 创建标记,再用 is MISSING 区分第一种情况;类型注解也能写 str | None | MISSING。它为真值,浅拷贝和深拷贝都会返回它自己。 类似的区分早已存在:NotImplemented 表示当前运算实现不支持该操作,让 Python 尝试其他实现;Pydantic 的 MISSING 区分字段未提交和显式 null。 传统 object() 标记在运行时可用,但静态类型收窄、复制和序列化都有额外问题。新内置也有边界:pickle 要求满足命名与作用域规则,函数内部创建的哨兵不能直接 pickle;类型检查器支持仍需看具体版本。 “未提供”和“值为空”分开后,缓存未命中、配置不变、主动清空才不会共用一个含糊的 None。

曝光 31 · 评论 1 · 点赞 0 · 书签 0

查看原帖