Удобная итерация объектов хранилища данных - PullRequest
1 голос
/ 16 февраля 2012

Пожалуйста, расскажите мне, как сделать это правильно, так как я чувствую, что мой нынешний путь многословен.

Я знаю, что перебирать все сущности в App Engine не совсем так, как он спроектирован, чтобыиспользуется, но иногда я хочу собрать статистику о моих сущностях, например, сколько пользователей составляют женщины.В действительности критерии могут быть чем-то более сложным, но в любом случае требуется анализ каждой сущности.

Вот некоторый псевдошумный код того, как я перебираю сущности:

def handle_count_female_users(cursor = None, counter = 0):
    q = User.all()
    if cursor:
        q.with_cursor(cursor)
    MAX_FETCH = 100
    users = q.fetch(MAX_FETCH)

    count_of_female_users = len(filter(lambda user:user.gender == 'female', users))
    total_count = counter + count_of_female_users

    if len(users) == MAX_FETCH:
        Task(
            url = "/count_female_users",
            params = {
                'counter' : str(total_count),
                'cursor' : q.cursor()
            }
        ).add()
    else:
        # Now finally have the result
        logging.info("We have %s female users in total." % total_count)

Iесть код маршрутизации, который автоматически отображает GET / foo для обработки handle_foo, что мне показалось удобным.Как вы можете видеть, даже при этом у меня есть много вещей, поддерживающих циклы, почти не имеющих ничего общего с тем, что я на самом деле хочу достичь.

То, что я действительно хотел бы сделать, это что-то вроде:

tally_entities(
    entity_class = User,
    filter_criteria = lambda user:user.gender == 'female',
    result = lambda count:logging.info("We have %s female users in total" % count)
)

Есть идеи, как приблизиться к этому идеалу, или есть какой-то еще лучший способ?

1 Ответ

3 голосов
/ 16 февраля 2012

Звучит как хороший вариант использования mapreduce: http://code.google.com/p/appengine-mapreduce/wiki/GettingStartedInPython

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