Welcome, guest | Sign In | My Account | Store | Cart

Notice! PyPM is being replaced with the ActiveState Platform, which enhances PyPM’s build and deploy capabilities. Create your free Platform account to download ActivePython or customize Python with the packages you require and get automatic updates.

pypm install zc.extrinsicreference

How to install zc.extrinsicreference

  1. Download and install ActivePython
  2. Open Command Prompt
  3. Type pypm install zc.extrinsicreference
 Python 2.7Python 3.2Python 3.3
Windows (32-bit)
0.3.0 Available View build log
Windows (64-bit)
0.3.0 Available View build log
Mac OS X (10.5+)
0.3.0 Available View build log
Linux (32-bit)
0.3.0 Available View build log
Linux (64-bit)
0.3.0 Available View build log
ZPL 2.1
Lastest release
version 0.3.0 on Jan 5th, 2011

Extrinsic Key References

See src/zc/extrinsicreference/README.txt for details.

Detailed Documentation

Extrinsic References

Extrinsic reference registries record a key and one or more values to which they refer. The key and all values must be adaptable to 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)

Values can be retrieved by their key:

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

References can be removed:

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

But if the reference is not registered, removing it raises a KeyError.

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

If you prefer to silently ignore these errors, use discard.

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

Otherwise, you can use contains to determine if the reference exists:

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

If a key has no associated values, an empty iterable is returned:

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

Adding a value more than once does not cause the value to be included in the result sequence more than once:

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

The set method destructively sets the given values for the object. Repeated objects are collapsed to a single instance.

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

The update method adds values to the previous values, non-destructively.

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


0.3.0 (2009-08-27)
  • Fix errors introduced in 0.2.0 refactoring:

1. Stop referring to extrinsicreference module from ZCML. The code is now in __init__.py.

2. Revert registerShortcut and unregisterShortcut changes. These two functions are handlers in track_shortcuts.zcml.

  1. Add more package infrastructure, such as this file.
0.2.0 (2009-08-26)
  • Refactored an existing stable code.
  • Initial release as an egg.

Subscribe to package updates

Last updated Jan 5th, 2011

Download Stats

Last month:1

What does the lock icon mean?

Builds marked with a lock icon are only available via PyPM to users with a current ActivePython Business Edition subscription.

Need custom builds or support?

ActivePython Enterprise Edition guarantees priority access to technical support, indemnification, expert consulting and quality-assured language builds.

Plan on re-distributing ActivePython?

Get re-distribution rights and eliminate legal risks with ActivePython OEM Edition.