跳转到主要内容

冻结对象的模式

项目描述

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 (10.2 kB 查看哈希值)

上传时间 源代码

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面