Python中的Sentinel(哨兵)值
哨兵值是一个特殊值(唯一),因为和所有其它值不同,所以可以作为区分其它值得标记。
你有可能已经使用过它,比如
val = mydict.get("some_key", None)
当"some_key",不存在时,返回None。在这儿None可以认为是哨兵值。
但问题是,如果本来它的值有可能是None
mydict['some_key'] = None
你可能会考虑其它的哨兵值。
val = mydict.get("some_key", "NONE")
但如果"NONE"也是合法值呢。你可能又要换成其它值,换来换去,问题还是没有彻底解决。
这时候,你需要一个独特的值,来彻底和其它值区分。
MISSING = object() val = mydict.get(key, MISSING) # later... if val is MISSING: # ...
object()的这个实例MISSING,在其它任何地方都不会出现,不会出现重复的可能。
来看看Flask源码中的例子
# a singleton sentinel value for parameter defaults _sentinel = object() class Flask():
# ... def do_teardown_request(self, exc=_sentinel): if exc is _sentinel: pass
参考:https://treyhunner.com/2019/03/unique-and-sentinel-values-in-python/