исходники следующие:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def path(data):
"""Эта функция позволяет работать с вложенными деревьями, списками и iterable объектами.
Так же, она позволяет получать атрибуты объектов и выбирать данные внутри них.
Все вычисления "ленивые".
>>> class Meta(object):
... def __init__(self, value):
... self.value = value
... self.dvalue = dict(a = value)
... def __repr__(self):
... return u'<meta: %s>' % self.value
>>>
>>> data = {
... 'voices': 100500,
... 'items': [
... {
... 'id': 1,
... 'name': 'User1',
... 'meta': Meta(123),
... },
... {
... 'id': 2,
... 'name': 'User2',
... 'meta': Meta(456),
... },
... 'text item',
... {
... 'name': 'Without id',
... },
... ]
... }
>>> hasattr(path(data).items, '__iter__')
True
>>> list(path(data).voices)
[100500]
>>> list(path(data).items)
[{'meta': <meta: 123>, 'id': 1, 'name': 'User1'}, {'meta': <meta: 456>, 'id': 2, 'name': 'User2'}, 'text item', {'name': 'Without id'}]
>>> list(path(data).items.id)
[1, 2]
>>> list(path(data).items.meta['value'])
[123, 456]
>>> list(path(data).items.meta['dvalue'].a)
[123, 456]
>>> list(path(data).items[2:].name)
['Without id']
>>> items = path(data).items
>>> list(items.name)
['User1', 'User2', 'Without id']
>>> list(items.id)
[1, 2]
>>> # так же должно работать со списком данных
>>> list(path([data, data]).items.meta['dvalue'].a)
[123, 456, 123, 456]
>>> # и с обычными объектами тоже
>>> list(path(Meta(123))['dvalue'].a)
[123]
>>> # и с генераторами
>>> list(path(Meta(x) for x in xrange(10))['dvalue'].a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
"""
pass
if __name__ == '__main__':
import doctest
doctest.testmod()