在python中表示特殊含义的各种对象

sentinels的Python项目详细描述


概述

sentinels模块是一个提供sentinel类和有用实例的小实用程序。

什么是哨兵?

哨兵是具有特殊意义的物体。它们可以被认为是单例的,但是它们满足了在代码中使用具有特殊含义的“特殊”值的需要(参见下面的示例)。

为什么我需要哨兵?

nothing为例。此哨兵将自动与哨兵导入一起提供:

>>> from sentinels import NOTHING

假设您正在python字典周围编写一个包装器,它支持一种特殊的方法get_default_或_raise。此方法的行为类似于{EM1}$GET,但是当它不接收默认值且密钥不存在时,它会引发一个^ {EM1}$KEYEMAGE 。你会怎么做?最简单的方法是:

>>> 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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java无法从springboot控制器返回html页面   java使HttpURLConnection加载带有图像的网页   树集上的java迭代器导致无限循环   java为什么我的Cucumber Selenium测试有0毫秒?   java如何创建Android ICS拖放阴影效果?   算法使用JAVA在未排序的数组中查找所有可能的连续子集   java如何使用请求编写JDO查询。getParameter()?   java命名查询和分页   多线程Java有自动并行吗?   java Android菜单getItemId int比较失败   谁使用实时Java?   在Datatable中使用Filter的java动态计算   java在mongo和spring boot中使用不确定模式的querydsl   带缩放功能的Java 安卓 ImageView   java在多用户web应用程序中保护数据   java如何自动获取模块bean?   java Geotools根据多边形和尺寸创建CR   java如何制作自定义类别转换器