Карта NDB (обратный вызов, generate_cursors = True)

В документации Google AppEngine NDB для map() указано, что:

«Поддерживаются все аргументы ключевого слова параметров запроса».

Однако я пытался использовать produces_cursors=True на map(), и я не получаю курсор обратно.

map(callback, pass_batch_into_callback=None, merge_future=None, **q_options)

Я хотел бы использовать map(), поскольку я могу установить обратный вызов для тасклета.

https://developers.google.com/appengine/docs/python/ndb/queryclass#kwdargs_options

Изменить. Предоставление образца кода:

@ndb.tasklet
def callback(user):
    statistics = yield ndb.Key(Statistics, user.key.id()).get_async()
    raise ndb.Return(user, statistics)

result = User.query().map(callback, produces_cursors=True)

person Chris    schedule 02.01.2013    source источник
comment
Можете ли вы предоставить фрагмент кода?   -  person bossylobster    schedule 03.01.2013
comment
Конечно, @bossylobster, я добавил пример кода.   -  person Chris    schedule 03.01.2013
comment
Действительно, вы правы, tasklets.MultiFuture возвращает только список (code.google.com/p/appengine-ndb-experiment/source/browse/ndb/), а map_query не сохраняет никакой информации о курсоре.   -  person bossylobster    schedule 03.01.2013
comment
Привет @Chris, мне кажется, тебе удалось заставить курсоры как-то работать, в моем случае даже без опечаток что-то идет не так. Я подробно описал это здесь, stackoverflow.com/questions/21118732/ Может быть, вы заметите что-то очевидное, что я упускаю из виду. Ценю твою помощь.   -  person Harshal Patil    schedule 14.01.2014
comment
@HarshalPatil - Гвидо упоминает ниже, что map () не возвращает курсоры, помогает ли это?   -  person Chris    schedule 14.01.2014
comment
Это правда, что карта не возвращает курсоры, но итератор запроса должен их иметь, согласно документации. Это когда-нибудь работало для вас?   -  person Harshal Patil    schedule 14.01.2014


Ответы (1)


В примере, кажется, есть опечатка — правильный флаг — produce_cursors, а не produces_cursors.

Но курсоры доступны только при использовании итератора, а не map(). Посмотрите пример асинхронных итераторов; это немного работы, но вы определенно можете использовать его, чтобы вручную создать тасклет для каждого результата.

person Guido van Rossum    schedule 04.01.2013