首页 > 技术文章 > Python中的Sentinel(哨兵)值

jeff-ideas 2018-05-21 12:03 原文

 哨兵值是一个特殊值(唯一),因为和所有其它值不同,所以可以作为区分其它值得标记。

你有可能已经使用过它,比如

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/ 

 

 

 

 

  

 

推荐阅读