Как создать конвейер итератора в Python? - PullRequest
4 голосов
/ 31 мая 2011

Есть ли библиотека или рекомендуемый способ создания конвейера итератора в Python?

Например:

>>>all_items().get("created_by").location().surrounding_cities()

Я также хочу иметь возможность доступа к атрибутам объектов витераторы.В приведенном выше примере all_items() возвращает итератор элементов, и элементы имеют разных создателей.

Затем .get("created_by") возвращает атрибут «selected_by» предметов (которые являются людьми), а затем location() возвращает город каждого человека, а затем передает его на surrounding_cities(), который возвращает всеитератор окружающих городов для каждого местоположения (таким образом, конечный результат - большой список окружающих городов).

Ответы [ 3 ]

4 голосов
/ 31 мая 2011

Разве вы не просто обрабатываете итератор? Естественным способом использования итератора в Python является цикл for:

for item in all_items():
    item.get("created_by").location().surrounding_cities()

Существуют и другие возможности, такие как списки, которые могут иметь больше смысла в зависимости от того, что вы делаете (обычно имеет больше смысла, если вы пытаетесь сгенерировать список в качестве вывода).

1 голос
/ 30 января 2013

в вашем примере у вас действительно есть только два метода итератора, all_items и surrounding_cities, так что вы могли бы очень хорошо справиться только с itertools.chain:

from itertools import chain

cities = chain.from_iterable(
    item.get("created_by").location().surrounding_cities() for item in all_items()
)

cities будет тогда итератором, перечисляющим все окружающие города для пунктов

1 голос
/ 31 мая 2011

Я предлагаю вам посмотреть, как реализовать конвейеры с сопрограммами в python , более конкретно этот пример pipe

Если вы реализовали свои функции в соответствии с примером вышетогда ваш код будет выглядеть примерно так (для простоты, я полагаю, вы захотите напечатать эти города):

all_items(get_location(get_creators(get_surrounding_cities(printer()))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...