命名实体集合

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,则保留这些属性, omitcopy

^{p页R 37}$

Changes

0.3 (2011-06-13)

  • 向集合添加允许重写或忽略 组件。

0.2 (2011-04-14)

  • 已更新入口点的组件名称。

0.1 (2011-04-13)

  • 初次发布。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Cassandra复制因子大于节点数   java J2EE JTA事务回滚不适用于OSE Glassfish 4.0(Build 89)   java spring安全预认证用户登录   org的java类文件。反应流。从RxJava编译示例时未找到Publisher?   java在使用dataFormat作为POJO通过Camel调用Web服务时无法设置SOAP标头   Javafx类的java静态实例   java如何防止一个部件在关闭时覆盖另一个部件的位置   sql server无法从我的java代码连接到数据库   java在JList(Swing)中显示带有的ArrayList   从Java中的CXF服务获取WSAddressing数据   使用资产文件夹进行java简单json解析(本地)   java LDAPException未绑定的无效凭据   JavaJSFspring部署到weblogic   JAVA中字符数组中的特定元素排列?   如果脚本位于不同的目录中,则ant不会使用exec标记运行Javashell脚本