生成并解析到对象的路径。
z3c.objpath的Python项目详细描述
对象路径
这个包裹包含两件事:
- z3c.objpath.interfaces.IObjectPath接口。
- 一些用于构造(相对)对象路径的辅助函数,在 z3c.objpath.path。
其思想是特定的应用程序可以实现 实现IObjectPath接口,以便 以统一的方式构造到对象的路径。实施可能是 使用zope.traversing完成,但在某些情况下您需要 特定于应用程序的对象路径。在本例中,函数 z3c.objpath.path可能有用。
我们将有一个简单的项目:
>>> class Item(object): ... __name__ = None ... __parent__ = None ... def __repr__(self): ... return '<Item %s>' % self.__name__
让我们创建一个类似容器的简单对象:
>>> class Container(Item): ... def __init__(self): ... self._d = {} ... def __setitem__(self, name, obj): ... self._d[name] = obj ... obj.__name__ = name ... obj.__parent__ = self ... def __getitem__(self, name): ... return self._d[name] ... def __repr__(self): ... return '<Container %s>' % self.__name__
现在让我们创建一个结构:
>>> root = Container() >>> root.__name__ = 'root' >>> data = root['data'] = Container() >>> a = data['a'] = Container() >>> b = data['b'] = Container() >>> c = data['c'] = Item() >>> d = a['d'] = Item() >>> e = a['e'] = Container() >>> f = e['f'] = Item() >>> g = b['g'] = Item()
我们现在将执行两个函数,path和resolve,这两个函数 彼此是相反的:
>>> from z3c.objpath import path, resolve
我们可以从root:
创建到a的路径>>> path(root, a) '/root/data/a'
我们也可以再次解决:
>>> resolve(root, '/root/data/a') <Container a>
我们还可以从data:
创建到a的路径>>> path(data, a) '/data/a'
再解决一次:
>>> resolve(data, '/data/a') <Container a>
我们可以做一个更深入的路径:
>>> path(root, f) '/root/data/a/e/f'
并解决它:
>>> resolve(root, '/root/data/a/e/f') <Item f>
路径'/'指向根对象:
>>> resolve(root, '/') <Container root>
如果无法构造路径,则会出现错误:
>>> path(e, a) Traceback (most recent call last): ... ValueError: Cannot create path for <Container a>
如果无法解析路径,也会出现错误:
>>> resolve(root, '/root/data/a/f/e') Traceback (most recent call last): ... ValueError: Cannot resolve path /root/data/a/f/e
z3c.objpath更改
1.2(2018-06-14)
- 添加对python 3.5、3.6、pypy和pypy3的支持。
1.1(2012-10-13)
- 为z3c添加名称空间声明。
- 添加了一个测试额外的,因为测试需要zope.testing。
1.0(2008-04-15)
- 首次公开发行。