将数据结构构建为节点树
node的Python项目详细描述
节点
这个包是zodict的继承者。
概述
数据结构可以描述为树。有些是天生的, 像XML文档、LDAP目录或文件系统目录树,而其他 可以这样对待。
此外,python还提供了定制各种与数据模型相关的数据模型的优雅方法。 API。字典容器类型 几乎完全符合表示树节点的目的。相同的 api也在 zope.interface.common.mapping.ifullmapping 中描述。 另外,节点必须提供层次结构信息。在这种情况下 使用了zope.location.interfaces.ilocation的协定。
拥有这样的数据结构树有一些优点:
- 不同数据模型和/或数据源的统一数据访问api
- 树可以在两个方向上遍历
- 一旦进入内存,节点树就可以快速处理
- 在节点树上工作的软件可能不需要知道内部数据 结构,只要节点树实现提供正确的 接口合同
用法
节点 附带一些"准备导入和使用"节点。
无序的节点。这可以用作树的基础,其中项目的顺序 无所谓:
>>> fromnode.baseimportBaseNode>>> root=BaseNode(name='root')>>> root['child']=BaseNode()>>> root.printtree()<class 'node.base.BaseNode'>: root
<class 'node.base.BaseNode'>: child
有序的节点。保留项目顺序:
>>> fromnode.baseimportOrderedNode>>> root=OrderedNode(name='orderedroot')>>> root['foo']=OrderedNode()>>> root['bar']=OrderedNode()>>> root.printtree()<class 'node.base.OrderedNode'>: orderedroot
<class 'node.base.OrderedNode'>: foo
<class 'node.base.OrderedNode'>: bar
>>> root.items()[('foo', <OrderedNode object 'foo' at ...>),
('bar', <OrderedNode object 'bar' at ...>)]
节点接口的完整api描述可以在 node.interfaces.inode
对节点功能进行更精细的控制
节点 使用管道工包。
因此,节点的不同行为由管道行为提供。读 有关管道系统的详细信息,请参阅 水管工的文档:
>>> fromplumberimportplumbing>>> fromnode.behaviorsimport(... Nodespaces,... Attributes,... Lifecycle,... NodeChildValidate,... Adopt,... DefaultInit,... Nodify,... OdictStorage,... )>>> @plumbing(... Nodespaces,... Attributes,... Lifecycle,... NodeChildValidate,... Adopt,... DefaultInit,... Nodify,... OdictStorage)... classCustomNode(object):... pass>>> dir(CustomNode)['__class__', '__contains__', '__delattr__', '__delitem__',
'__dict__', '__doc__', '__format__', '__getattribute__',
'__getitem__', '__hash__', '__implemented__', '__init__',
'__iter__', '__len__', '__module__', '__name__',
'__new__', '__nonzero__', '__parent__', '__plumbing__',
'__plumbing_stacks__', '__provides__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__setitem__',
'__sizeof__', '__str__', '__subclasshook__', '__weakref__',
'_nodespaces', '_notify_suppress', 'acquire', 'allow_non_node_childs',
'attribute_access_for_attrs', 'attributes', 'attributes_factory',
'attrs', 'clear', 'copy', 'deepcopy', 'detach', 'events', 'filtereditems',
'filtereditervalues', 'filteredvalues', 'get', 'has_key', 'items',
'iteritems', 'iterkeys', 'itervalues', 'keys', 'name', 'noderepr',
'nodespaces', 'parent', 'path', 'pop', 'popitem', 'printtree',
'root', 'setdefault', 'storage', 'update', 'values']
正如 dir 调用所显示的,使用给定的行为检测 customnode 类, 因此定义一个完整的 inode 实现 行为,现在很容易做到:
>>> node=CustomNode()>>> node['child']=CustomNode()>>> node.printtree()<class 'CustomNode'>: None
<class 'CustomNode'>: child
>>> fromnode.interfacesimportINode>>> INode.providedBy(node)True
行为
节点包提供了几个管道行为:
< DL>JSON序列化
节点可以序列化为json,也可以从json反序列化:
>>> fromnode.serializerimportserialize>>> json_dump=serialize(BaseNode(name='node'))>>> fromnode.serializerimportdeserialize>>> deserialize(json_dump)<BaseNode object 'node' at ...>
有关序列化API的详细信息,请读取 文档/存档/序列化程序.rst
迁移
行为类似于zodict.node的节点包含在node.base.node中。 此节点应该用于从zodict迁移。
查看原始节点构建的行为也很有用 从
可能实现不需要同时执行所有行为。在这种情况下 直接在节点类上定义节点管道,而不是从 node.base.node
测试覆盖率
测试覆盖率报告摘要:
Name Stmts Miss Cover --------------------------------------------------------------------------- src/node/base.py 23 0 100% src/node/behaviors/__init__.py 40 0 100% src/node/behaviors/alias.py 103 0 100% src/node/behaviors/attributes.py 37 0 100% src/node/behaviors/cache.py 69 0 100% src/node/behaviors/common.py 130 0 100% src/node/behaviors/events.py 114 0 100% src/node/behaviors/fallback.py 45 0 100% src/node/behaviors/lifecycle.py 48 0 100% src/node/behaviors/mapping.py 117 0 100% src/node/behaviors/nodespace.py 33 0 100% src/node/behaviors/nodify.py 87 0 100% src/node/behaviors/order.py 42 0 100% src/node/behaviors/reference.py 83 0 100% src/node/behaviors/storage.py 31 0 100% src/node/compat.py 10 0 100% src/node/events.py 32 0 100% src/node/interfaces.py 101 0 100% src/node/locking.py 23 0 100% src/node/serializer.py 134 0 100% src/node/testing/__init__.py 1 0 100% src/node/testing/base.py 66 0 100% src/node/testing/env.py 18 0 100% src/node/testing/fullmapping.py 177 0 100% src/node/tests/__init__.py 88 0 100% src/node/tests/test_alias.py 113 0 100% src/node/tests/test_attributes.py 38 0 100% src/node/tests/test_base.py 245 0 100% src/node/tests/test_cache.py 98 0 100% src/node/tests/test_common.py 154 0 100% src/node/tests/test_events.py 184 0 100% src/node/tests/test_fallback.py 46 0 100% src/node/tests/test_lifecycle.py 105 0 100% src/node/tests/test_locking.py 43 0 100% src/node/tests/test_mapping.py 22 0 100% src/node/tests/test_nodespace.py 44 0 100% src/node/tests/test_nodify.py 45 0 100% src/node/tests/test_order.py 138 0 100% src/node/tests/test_reference.py 74 0 100% src/node/tests/test_serializer.py 222 0 100% src/node/tests/test_storage.py 41 0 100% src/node/tests/test_testing.py 688 0 100% src/node/tests/test_tests.py 50 0 100% src/node/tests/test_utils.py 127 0 100% src/node/utils.py 142 0 100%
python版本
- python 2.7,3.3+,pypy
- 可与其他版本(未经测试)一起使用