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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top