命名实体集合
dolmen.collection的Python项目详细描述
Dolmen Collection提供了一个集合实现,它允许 操作命名元素:排列顺序,提取集合的一部分, 强制使用一种组件类型并轻松添加新组件。
它起源于zeam.form,用于实现 字段、操作和小部件的集合。
内容
API description
Components
首先让我们看看组件,即在集合中参与的元素:
>>> from dolmen.collection.components import Component >>> c1 = Component(u'The Sun', 'sun') >>> c1 <Component The Sun> >>> c1.identifier 'sun' >>> c1.title u'The Sun'
它正确地实现了icomponent:
>>> from zope.interface.verify import verifyObject >>> from dolmen.collection import interfaces >>> verifyObject(interfaces.IComponent, c1) True
实际上,您可以创建一个没有id的组件,甚至可以使用 Unicode标题:
>>> c2 = Component(u'Moon') >>> c2 <Component Moon> >>> c2.identifier 'moon' >>> c2.title u'Moon'
或者一个数字(它不会被转换成字符串。像这样,这种支持 zope翻译信息:
>>> c69 = Component(69) >>> c69.title 69
如果这样做,标题包含空格,它们将被替换为 -。如果包含UTF-8字符,则标识将为 编码:
>>> c3 = Component(u'Some lost planet') >>> c3.identifier 'some-lost-planet' >>> c4 = Component(u'État du désir') >>> c4.identifier 'c383c2897461742d64752d64c383c2a9736972'
空间是标准化的:
>>> c5 = Component(' Some unappropriate spacing ') >>> c5.identifier 'some-unappropriate-spacing'
您可以克隆组件并更改其标识符:
>>> c3clone = c3.clone('new-world') >>> c3clone <Component Some lost planet> >>> c3clone.identifier 'new-world' >>> c3clone is c3 False
但你也可以保留旧的:
>>> c4clone = c4.clone() >>> c4clone.identifier 'c383c2897461742d64752d64c383c2a9736972' >>> c4clone is c4 False
Collection
集合是简单的对象,实现icollection:
>>> from dolmen.collection.components import Collection >>> s1 = Collection() >>> s1 <Collection> >>> len(s1) 0 >>> verifyObject(interfaces.ICollection, s1) True
Adding components to a collection
现在我们可以将组件放在一个集合中,并在 相同顺序:
>>> s1.append(c1) >>> list(s1) [<Component The Sun>] >>> s1.append(c2) >>> list(s1) [<Component The Sun>, <Component Moon>]
但不能添加两次相同的组件:
>>> s1.append(c1) Traceback (most recent call last): ... ValueError: (u'Duplicate identifier', 'sun')
这需要是一个组件:
>>> s1.append('home') Traceback (most recent call last): ... TypeError: (u'Invalid type', 'home')
您可以使用组件或集合作为参数来创建集合:
>>> s2 = Collection(Component('Jupiter'), Component('Saturn')) >>> list(s2) [<Component Jupiter>, <Component Saturn>] >>> len(s2) 2 >>> list(Collection(s2, Component('Uranus'))) [<Component Jupiter>, <Component Saturn>, <Component Uranus>] >>> Collection(42) Traceback (most recent call last): ... TypeError: (u'Invalid type', 42)
您可以添加集合。你将收到一份 组件。组件将按以下方式订购:
>>> s3 = s1 + s2 >>> s3 <Collection> >>> s3 is s1 False >>> list(s3) [<Component The Sun>, <Component Moon>, <Component Jupiter>, <Component Saturn>] >>> len(s3) 4 >>> list(s2 + s1) [<Component Jupiter>, <Component Saturn>, <Component The Sun>, <Component Moon>]
您可以扩展集合。它的工作原理与construtor类似:
>>> s3.extend(Component('Venus'), Component('Uranus')) >>> list(s3) [<Component The Sun>, <Component Moon>, <Component Jupiter>, <Component Saturn>, <Component Venus>, <Component Uranus>] >>> s3.extend('Kitty') Traceback (most recent call last): ... TypeError: (u'Invalid type', 'Kitty')
您可以复制收藏:
>>> s3copy = s3.copy() >>> list(s3copy) == list(s3) True >>> s3copy is s3 False
您可以从集合中删除所有元素:
>>> len(s1) 2 >>> s1.clear() >>> len(s1) 0
Ignoring already defined components
>>> from dolmen.collection.components import IGNORE >>> ignoring = Collection() >>> ignoring.behavior = IGNORE>>> ignoring.append(c1) >>> list(ignoring) [<Component The Sun>] >>> ignoring.append(c2) >>> list(ignoring) [<Component The Sun>, <Component Moon>]>>> c1prime = Component(u'The Sun prime', 'sun')
可以添加两次相同的组件,忽略第二个组件:
>>> ignoring.append(c1prime) >>> list(ignoring) [<Component The Sun>, <Component Moon>]
Overriding already defined components
>>> from dolmen.collection.components import OVERRIDE >>> overriding = Collection() >>> overriding.behavior = OVERRIDE>>> overriding.append(c1) >>> list(overriding) [<Component The Sun>] >>> overriding.append(c2) >>> list(overriding) [<Component The Sun>, <Component Moon>]>>> c1prime = Component(u'The Sun prime', 'sun')
您可以添加两次相同的组件,第二个将覆盖第一个:
>>> overriding.append(c1prime) Traceback (most recent call last): ... NotImplementedError
它需要是一个imutablecollection:
>>> from dolmen.collection import IMutableCollection >>> from zope.interface import directlyProvides >>> directlyProvides(overriding, IMutableCollection) >>> overriding.append(c1prime) >>> list(overriding) [<Component The Sun prime>, <Component Moon>]
Retriving components from a collection
您可以检索集合中的一个元素:
>>> s3.get('moon') <Component Moon> >>> s3.get('uranus') <Component Uranus> >>> s3.get('me') Traceback (most recent call last): ... KeyError: 'me' >>> s3.get('me', default=42) 42
和措辞类似的访问工作:
>>> s3['uranus'] <Component Uranus> >>> s3['venus'] <Component Venus> >>> s3['somewhere'] Traceback (most recent call last): ... KeyError: 'somewhere'
您可以获取所有组件ID:
>>> s3.keys() ['sun', 'moon', 'jupiter', 'saturn', 'venus', 'uranus']
您可以测试组件ID是否在集合中:
>>> 'moon' in s3 True >>> 'earth' in s3 False
您可以使用第一个 一:
>>> s4 = s3.select('venus', 'uranus') >>> s4 is s3 False >>> list(s4) [<Component Venus>, <Component Uranus>] >>> s4.keys() ['venus', 'uranus']
或者另一种方式来绕过集合的某些组件:
>>> s5 = s3.omit('sun', 'moon') >>> s5 is s3 False >>> list(s5) [<Component Jupiter>, <Component Saturn>, <Component Venus>, <Component Uranus>]
Sorting components in a collection
collection sort调用用作标准python列表的调用:
>>> s5.sort() >>> print list(s5) [<Component Jupiter>, <Component Saturn>, <Component Uranus>, <Component Venus>]
我们可以使用标准参数(cmp、key和reverse):
>>> s5.sort(reverse=True) >>> print list(s5) [<Component Venus>, <Component Uranus>, <Component Saturn>, <Component Jupiter>] >>> s5.sort(reverse=True, key=lambda el: el.identifier[-1:]) >>> print list(s5) [<Component Venus>, <Component Uranus>, <Component Jupiter>, <Component Saturn>] >>> def myLengthSort(a1, a2): ... return cmp(len(a1), len(a2)) >>> s5.sort(reverse=True, key=lambda el: el.identifier, cmp=myLengthSort) >>> print list(s5) [<Component Jupiter>, <Component Uranus>, <Component Saturn>, <Component Venus>]
集合也可以反转,作为标准列表:
>>> s5.reverse() >>> print list(s5) [<Component Venus>, <Component Saturn>, <Component Uranus>, <Component Jupiter>]
可以使用 给定的id列表和排序组件cmp函数:
>>> from dolmen.collection import sort_components >>> s5.sort(sort_components(['uranus', 'venus', 'jupiter'])) >>> print list(s5) [<Component Uranus>, <Component Venus>, <Component Jupiter>, <Component Saturn>]
钥匙在过程中进行排序:
>>> print s5.keys() ['uranus', 'venus', 'jupiter', 'saturn']
连续排序将在相对位置留下未指定的字段:
>>> s5.sort(sort_components(['saturn', 'uranus'])) >>> print list(s5) [<Component Saturn>, <Component Uranus>, <Component Venus>, <Component Jupiter>]
我们还可以将排序还原为标准的python行为:
>>> s5.sort(sort_components(['uranus', 'venus']), reverse=True) >>> print list(s5) [<Component Saturn>, <Component Jupiter>, <Component Venus>, <Component Uranus>]
如果提供的列表格式不正确或小于2,则会引发错误 元素:
>>> s5.sort(sort_components(['uranus'])) Traceback (most recent call last): ... ValueError: Please provide a list of, at least, two component identifiers. >>> s5.sort(sort_components('something')) Traceback (most recent call last): ... ValueError: Please provide a valid list or tuple of component identifiers.
如果提供了未知ID,则行为将保持不变:
>>> s5.sort(sort_components(['venus', 'uranus', 'cardassia', 'bajor'])) >>> print list(s5) [<Component Venus>, <Component Uranus>, <Component Saturn>, <Component Jupiter>]
Parameters on collections
您可以为集合提供额外的参数,这些参数将被设置为 对象上的属性:
>>> s6 = Collection(s2, name=u'me', city=u'rotterdam') >>> s6 <Collection> >>> list(s6) [<Component Jupiter>, <Component Saturn>] >>> s6.name u'me' >>> s6.city u'rotterdam'
如果使用操作select,则保留这些属性, omit或copy:
^{p页R 37}$