Генератор Pimongo не удается - «вернуть» с аргументом внутри генератора

StackOverflow https://stackoverflow.com/questions/8303483

  •  25-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь сделать следующее:

def get_collection_iterator(collection_name, find={}, criteria=None):
    collection = db[collection_name]
    # prepare the list of values of collection
    if collection is None:
        logging.error('Mongo could not return the collecton - ' + collection_name)
        return None

    collection = collection.find(find, criteria)
    for doc in collection:
        yield doc 

и звонить как:

def get_collection():
    criteria = {'unique_key': 0, '_id': 0}
    for document in Mongo.get_collection_iterator('contract', {}, criteria):
        print document 

И я вижу ошибку, в которой говорится:

File "/Users/Dev/Documents/work/dw/src/utilities/Mongo.py", line 96
    yield doc
SyntaxError: 'return' with argument inside generator 

Что я здесь делаю неправильно?

Это было полезно?

Решение

Кажется, проблема в том, что Python не позволяет вам смешивать return а также yield - Вы используете оба внутри get_collection_iterator.

Разъяснение (спасибо Робу Мэйоффу): return x а также yield нельзя смешать, но голый return Можно

Другие советы

Ваша проблема в случае None Должен быть возвращен, но он обнаруживается как синтаксисная ошибка, так как возврат сломает петлю итерации.

Генераторы, которые предназначены для использования yield Для передачи значений в циклах не может использовать возврат с значениями аргумента, так как это вызвало бы StopIteration ошибка. Вместо возвращения None, Вы можете поднять исключение и поймать его в контексте вызова.

http://www.answermysearches.com/python-fixing-syntaxerror-return-with-argument-inside-Generator/354/

def get_collection_iterator(collection_name, find={}, criteria=None):
    collection = db[collection_name]
    # prepare the list of values of collection
    if collection is None:
        err_msg = 'Mongo could not return the collecton - ' + collection_name
        logging.error(err_msg)
        raise Exception(err_msg)

    collection = collection.find(find, criteria)
    for doc in collection:
        yield doc 

Вы также можете сделать специальное исключение для этого, если это будет необходимо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top