pymongo生成器失败 - 在发生器内使用参数'返回'

时间:2011-11-28 22:47:23

标签: python generator pymongo

我正在尝试执行以下操作:

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 

我在这里做错了什么?

2 个答案:

答案 0 :(得分:12)

似乎问题是Python不允许你混合使用returnyield - 你在get_collection_iterator内同时使用。

澄清(感谢rob mayoff):return xyield无法混合,但只有return可以

答案 1 :(得分:3)

您的问题是在必须返回None的情况下,但它被检测为语法错误,因为返回会破坏迭代循环。

旨在使用yield来切换循环中的值的生成器不能使用带参数值的return,因为这会触发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 

如果需要,你也可以为此做一个特殊的例外。