在python中表示特殊含义的各种对象
sentinels的Python项目详细描述
概述
sentinels模块是一个提供sentinel类和有用实例的小实用程序。
什么是哨兵?
哨兵是具有特殊意义的物体。它们可以被认为是单例的,但是它们满足了在代码中使用具有特殊含义的“特殊”值的需要(参见下面的示例)。
为什么我需要哨兵?
以nothing为例。此哨兵将自动与哨兵导入一起提供:
>>> from sentinels import NOTHING
假设您正在python字典周围编写一个包装器,它支持一种特殊的方法get_default_或_raise。此方法的行为类似于{EM1}$GET
>>> class MyDict(dict): ... def get_default_or_raise(self, key, default=None): ... if key not in self and default is None: ... raise KeyError(key) ... return self.get(key, default)
甚至这个:
>>> class MyDict(dict): ... def get_default_or_raise(self, key, default=None): ... returned = self.get(key, default) ... if returned is None: ... raise KeyError(key) ... return returned
但是上面两段代码的问题是相同的——在编写一个通用实用程序类时,我们不知道以后如何使用它。更重要的是,none可能是一个完全有效的字典值!
这就是什么都派不上用场的地方:
>>> class MyDict(dict): ... def get_default_or_raise(self, key, default=NOTHING): ... returned = self.get(key, default) ... if returned is NOTHING: ... raise KeyError(key) ... return returned
还有塔达!
语义
哨兵总是等于自己:
>>> NOTHING == NOTHING True
但不要对其他对象:
>>> from sentinels import Sentinel >>> NOTHING == 2 False >>> NOTHING == "NOTHING" False
复制sentinels返回相同的对象:
>>> import copy >>> copy.deepcopy(NOTHING) is NOTHING True
当然还有腌制/脱腌制:
>>> import pickle >>> NOTHING is pickle.loads(pickle.dumps(NOTHING)) True