跳转到主要内容

外键引用注册表

项目描述

外键引用

有关详细信息,请参阅 src/zc/extrinsicreference/README.txt

详细文档

外键引用

外键引用注册表记录一个键和一个或多个引用的值。键和所有值都必须可适应 zope.app.keyreference.interfaces.IKeyReference。

>>> import zc.extrinsicreference
>>> references = zc.extrinsicreference.ExtrinsicReferences()
>>> references.add(1, 2)
Traceback (most recent call last):
...
TypeError: ('Could not adapt', 1...
>>> from zope import interface, component
>>> from zope.app.keyreference.interfaces import IKeyReference
>>> class IMyObject(interface.Interface):
...     "An interface for which we register an IKeyReference adapter"
...     id = interface.Attribute("An id unique to IMyObject instances")
...
>>> class MyObject(object):
...     interface.implements(IMyObject)
...     _id_counter  = 0
...     @classmethod
...     def _getId(cls):
...         val = cls._id_counter
...         cls._id_counter += 1
...         return val
...     def __init__(self):
...         self.id = self._getId()
...
>>> class DummyKeyReference(object):
...     interface.implements(IKeyReference)
...     component.adapts(IMyObject)
...     key_type_id = 'zc.extrinsicreference.doctest'
...     def __init__(self, obj):
...         self.object = obj
...     def __call__(self):
...         """Get the object this reference is linking to.
...         """
...         return self.object
...     def __hash__(self):
...         """Get a unique identifier of the referenced object.
...         """
...         return hash(self.object.id)
...     def __cmp__(self, other):
...         """Compare the reference to another reference.
...         """
...         if self.key_type_id == other.key_type_id:
...             return cmp(self.object.id, other.object.id)
...         return cmp(self.key_type_id, other.key_type_id)
...
>>> component.provideAdapter(DummyKeyReference)
>>> object1 = MyObject()
>>> references.add(object1, 2)
Traceback (most recent call last):
...
TypeError: ('Could not adapt', 2...
>>> value1 = MyObject()
>>> value2 = MyObject()
>>> references.add(object1, value1)
>>> references.add(object1, value2)

可以通过其键检索值

>>> set(references.get(object1)) == set((value1, value2))
True

可以删除引用

>>> references.remove(object1, value1)
>>> list(references.get(object1)) == [value2]
True

但是,如果引用未注册,则删除它将引发 KeyError。

>>> references.remove(object1, value1)
Traceback (most recent call last):
...
KeyError:...
>>> object2 = MyObject()
>>> references.remove(object2, value2)
Traceback (most recent call last):
...
KeyError:...

如果您希望静默忽略这些错误,请使用 discard

>>> references.discard(object1, value1)
>>> references.discard(object2, value2)

否则,您可以使用 contains 确定引用是否存在

>>> references.contains(object1, value1)
False
>>> references.contains(object2, value2)
False
>>> references.contains(object1, value2)
True

如果键没有关联的值,则返回一个空的可迭代对象

>>> references.discard(object1, value2)
>>> list(references.get(object1))
[]

重复添加值不会导致该值在结果序列中出现多次。

>>> references.add(object1, value1)
>>> references.add(object1, value1)
>>> list(references.get(object1)) == [value1]
True

《set》方法以破坏性方式为对象设置给定的值。重复的对象将被折叠成一个实例。

>>> references.set(object1, (value2, object2, value2, value2, object2))
>>> references.contains(object1, value1)
False
>>> len(list(references.get(object1)))
2
>>> set(references.get(object1)) == set((value2, object2))
True
>>> references.set(object1, ())
>>> len(list(references.get(object1)))
0

《update》方法以非破坏性方式向之前的值添加值。

>>> references.add(object1, value1)
>>> references.update(object1, (value2, object2, value2))
>>> len(list(references.get(object1)))
3
>>> set(references.get(object1)) == set((value1, value2, object2))
True

变更

0.3.0 (2009-08-27)

  • 修复0.2.0重构中引入的错误

    1. 停止从ZCML中引用extrinsicreference模块。代码现在在< span class="docutils literal">__init__.py中。

    2. 撤销registerShortcut和unregisterShortcut的更改。这两个函数是track_shortcuts.zcml中的处理程序。

    3. 添加更多包基础设施,例如此文件。

0.2.0 (2009-08-26)

  • 重构了现有的稳定代码。

  • 作为egg的初始版本发布。

项目详情


下载文件

下载适合您平台的应用程序。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源代码分发

zc.extrinsicreference-0.3.0.tar.gz (6.6 kB 查看哈希)

上传时间 源代码