冻结对象的模式
项目描述
zc.freeze 包提供冻结对象的模式。状态为信息性–执行未指定。包括一些执行方法和辅助工具。
详细文档
冻结
此包实现了冻结对象的基本功能:查询对象是否可以冻结、是否已冻结,以及实际冻结对象的拼写。可以在本包基本代码之上实现更多策略;此包中的大部分代码作为可插拔的选择提供,可以在保持基本API的同时省略。
要发现对象是否可冻结,客户端代码应询问它是否提供了zc.freeze.interfaces.IFreezable。
声明一个对象是 IFreezable 的站点配置或代码,确保该对象提供或可适应 zc.freeze.interfaces.IFreezing 接口。此接口仅包含三个元素:_z_frozen 是一个只读布尔值,表示对象是否已被版本化;_z_freeze_datetime 是一个只读 datetime,在 pytz.utc 中指定对象冻结的时间(如果没有冻结,则为 None);_z_freeze 是一个实际冻结对象的方法。如果对象已冻结,将引发 zc.freeze.interfaces.FrozenError。如果对象处于无法冻结的状态,可能会引发 zc.freeze.interfaces.FreezeError。如果冻结可能成功,则方法应发送 zc.freeze.interfaces.IObjectFrozenEvent(如 zc.freeze.interfaces.ObjectFrozenEvent)。
这是包的核心:一个 API 和一个协议,没有直接要测试的内容。这个包不支持的一项策略是,冻结对象可能首先创建一个副本并对其版本化,而不是对原始对象进行版本化;或者对原始对象进行版本化,但替换原始位置处的副本;或者做出其他选择。这些方法旨在在 zc.freeze API 之上实现。此包提供了更简单的功能。
便利性
该包确实提供了两个 IFreezing 的默认实现和一些便利功能。
一个 IFreezing 实现是为直接了解此 API 的对象设计的(与从适配器和其它组件组装的功能相反)。
>>> import zc.freeze >>> v = zc.freeze.Freezing() >>> from zc.freeze import interfaces >>> from zope.interface.verify import verifyObject >>> verifyObject(interfaces.IFreezing, v) True >>> verifyObject(interfaces.IFreezable, v) True >>> v._z_frozen False >>> v._z_frozen = True Traceback (most recent call last): ... AttributeError: can't set attribute >>> import pytz >>> import datetime >>> before = datetime.datetime.now(pytz.utc) >>> v._z_freeze() >>> before <= v._z_freeze_timestamp <= datetime.datetime.now(pytz.utc) True >>> v._z_frozen True >>> interfaces.IObjectFrozenEvent.providedBy(events[-1]) True >>> events[-1].object is v True >>> v._z_freeze() Traceback (most recent call last): ... FrozenError
另一个可用的实现是适配器,并将信息存储在注解中。这里有一个快速演示。
>>> import zope.annotation.interfaces >>> from zope import interface, component >>> class Demo(object): ... interface.implements(zope.annotation.interfaces.IAnnotatable) ... >>> import UserDict >>> class DemoAnnotations(UserDict.UserDict): ... interface.implements(zope.annotation.interfaces.IAnnotations) ... component.adapts(Demo) ... def __init__(self, context): ... self.context = context ... self.data = getattr(context, '_z_demo', None) ... if self.data is None: ... self.data = context._z_demo = {} ... >>> component.provideAdapter(DemoAnnotations) >>> component.provideAdapter(zc.freeze.FreezingAdapter) >>> d = Demo() >>> verifyObject(interfaces.IFreezing, interfaces.IFreezing(d)) True >>> verifyObject(interfaces.IFreezable, interfaces.IFreezing(d)) True >>> interfaces.IFreezing(d)._z_frozen False >>> interfaces.IFreezing(d)._z_frozen = True Traceback (most recent call last): ... AttributeError: can't set attribute >>> before = datetime.datetime.now(pytz.utc) >>> interfaces.IFreezing(d)._z_freeze() >>> (before <= interfaces.IFreezing(d)._z_freeze_timestamp <= ... datetime.datetime.now(pytz.utc)) True >>> interfaces.IFreezing(d)._z_frozen True >>> interfaces.IObjectFrozenEvent.providedBy(events[-1]) True >>> events[-1].object is d True >>> interfaces.IFreezing(d)._z_freeze() Traceback (most recent call last): ... FrozenError
zc.freeze 模块还包含三个用于编写具有冻结感知属性的辅助函数。
一个“方法”函数可以生成一个具有冻结感知的方法,如果对象已冻结,将引发 FrozenError。
“setproperty”和“delproperty”函数可以生成一个具有冻结感知的描述符,如果在冻结对象上调用 set 或 del 方法,将引发 FrozenError。这些都是可读写属性。
“makeProperty”生成一个具有冻结感知的描述符,执行简单的 get/set 操作,但在尝试在冻结对象上设置时引发 FrozenError。
>>> class BiggerDemo(Demo): ... counter = 0 ... @zc.freeze.method ... def increase(self): ... self.counter += 1 ... _complex = 1 ... @property ... def complex_property(self): ... return str(self._complex) ... @zc.freeze.setproperty ... def complex_property(self, value): ... self._complex = value * 2 ... zc.freeze.makeProperty('simple_property') ... >>> d = BiggerDemo() >>> d.counter 0 >>> d.complex_property '1' >>> d.simple_property # None >>> d.increase() >>> d.counter 1 >>> d.complex_property = 4 >>> d.complex_property '8' >>> d.simple_property = 'hi' >>> d.simple_property 'hi' >>> interfaces.IFreezing(d)._z_frozen False >>> interfaces.IFreezing(d)._z_freeze() >>> interfaces.IFreezing(d)._z_frozen True >>> d.counter 1 >>> d.increase() Traceback (most recent call last): ... FrozenError >>> d.counter 1 >>> d.complex_property '8' >>> d.complex_property = 10 Traceback (most recent call last): ... FrozenError >>> d.complex_property '8' >>> d.simple_property 'hi' >>> d.simple_property = 'bye' Traceback (most recent call last): ... FrozenError >>> d.simple_property 'hi'
CHANGES
1.2 (2011-04-08)
更新测试以与 ZTK 1.0 一起运行。
使用 Python 的 doctest 模块而不是已弃用的 zope.testing.doctest。
依赖于 zope.locking 的较新版本。
1.1
(支持 Zope 3.4/eggs)
1.1b
切换到支持 eggs
1.0
(支持 Zope 3.3/no eggs)
1.0.1
删除了包含的 rwproperty.py,并添加了依赖项,因为 rwproperty 现在可以从 pypi 获取。
项目详情
zc.freeze-1.2.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | da4bff1bb1ec3e98987a60fcc834032303df5c088fed3612aeb12a2723cab155 |
|
MD5 | f95e46bef5357fbd6d3f19410de14ecb |
|
BLAKE2b-256 | 03694c5036e97ab82ecec7e8bdb138796c02684178ca50a44b621a6b36407304 |