pymongo générateur échoue - « retour » avec l'argument générateur de l'intérieur
Question
Je suis en train de faire ce qui suit:
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
et appelant comme:
def get_collection():
criteria = {'unique_key': 0, '_id': 0}
for document in Mongo.get_collection_iterator('contract', {}, criteria):
print document
et je vois l'erreur en disant:
File "/Users/Dev/Documents/work/dw/src/utilities/Mongo.py", line 96
yield doc
SyntaxError: 'return' with argument inside generator
Qu'est-ce que je fais ici incorrecte?
La solution
Il semble que le problème est que Python ne vous permet pas de mélanger return
et yield
-. Vous utilisez à la fois dans les get_collection_iterator
Précision (merci à Rob Mayoff): return x
et yield
ne peut pas être mélangé, mais un return
nu peut
Autres conseils
Votre problème est dans le None
de l'événement doit être retourné, mais il est détecté comme une erreur de syntaxe depuis le retour briserait la boucle d'itération.
Les générateurs qui sont destinés à une utilisation yield
aux valeurs de transfert intercellulaire dans les boucles ne peuvent pas utiliser le retour avec des valeurs d'argument, car cela déclencherait une erreur de StopIteration
. Plutôt que de retourner None
, vous pouvez soulever une exception et l'attraper dans le contexte d'appel.
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
Vous pouvez faire une exception pour cela aussi le cas échéant.