Pymongo -Generator fällt fehl - 'Return' mit Argument im Generator
Frage
Ich versuche Folgendes zu tun:
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
und rufen wie:
def get_collection():
criteria = {'unique_key': 0, '_id': 0}
for document in Mongo.get_collection_iterator('contract', {}, criteria):
print document
Und ich sehe den Fehler sagen:
File "/Users/Dev/Documents/work/dw/src/utilities/Mongo.py", line 96
yield doc
SyntaxError: 'return' with argument inside generator
Was mache ich hier falsch?
Lösung
Es scheint, dass das Problem ist, dass Python Sie nicht erlaubt, sich zu mischen return
und yield
- Sie verwenden beides innerhalb get_collection_iterator
.
Klarstellung (dank Rob Mayoff): return x
und yield
Kann nicht gemischt werden, aber ein kahl return
kann
Andere Tipps
Ihr Problem ist für den Fall None
muss zurückgegeben werden, aber es wird als Syntaxfehler erkannt, da die Rückgabe die Iterationsschleife durchbrechen würde.
Generatoren, die verwenden sollen yield
Zu Übergabewerte in Schleifen kann die Return nicht mit Argumentwerten verwendet werden, da dies a auslösen würde StopIteration
Error. Anstatt zurückzukehren None
, Möglicherweise möchten Sie eine Ausnahme ansprechen und sie im Anrufkontext fangen.
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
Sie könnten auch eine besondere Ausnahme dafür machen, wenn es nötig ist.