Генератор Pimongo не удается - «вернуть» с аргументом внутри генератора
Вопрос
Я пытаюсь сделать следующее:
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
Вы также можете сделать специальное исключение для этого, если это будет необходимо.