TypeError:list对象不是迭代器

Lut*_*ris 6 python flask

我试图在flask-python中创建一个简单的post api,但是我收到了这个错误:

TypeError: list object is not an iterator
Run Code Online (Sandbox Code Playgroud)

但当我修改我的代码似乎很好可能是什么问题.

我的功能特别有问题:

def post(self,name):
        #return {'message': name}
        item = next(filter(lambda x: x['name'] == name, items), None)
        if item:
            return {'message':"An item with name '{}' already exixts. ".format(name)},400
        data = request.get_json()
        item = {'name': name, 'price':data['price']}
        items.append(item)
        return item, 201
Run Code Online (Sandbox Code Playgroud)

当我尝试在邮递员上发布某些内容时,我收到此logcat 错误:

[2018-06-07 10:41:02,849] ERROR in app: Exception on /item/test [POST]
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Python27\lib\site-packages\flask\app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Python27\lib\site-packages\flask_restful\__init__.py", line 480, in wrapper
    resp = resource(*args, **kwargs)
  File "C:\Python27\lib\site-packages\flask\views.py", line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "C:\Python27\lib\site-packages\flask_restful\__init__.py", line 595, in dispatch_request
    resp = meth(*args, **kwargs)
  File "G:\flask_workspace\MealBookingApp\MealBookingApp\MealBookingApp\views.py", line 30, in post
    item = next(filter(lambda x: x['name'] == name, items), None)
TypeError: list object is not an iterator
127.0.0.1 - - [07/Jun/2018 10:41:02] "POST /item/test HTTP/1.1" 500 -
Run Code Online (Sandbox Code Playgroud)

注意:

第30行,是下面的行:

item = next(filter(lambda x: x['name'] == name, items), None)
Run Code Online (Sandbox Code Playgroud)

Han*_*ave 8

要详细说明@ Rakesh的答案,列表不是迭代器,filter()Python 2中的输出是一个列表.要解决此问题,您可以使用该iter()函数输出与有问题的列表对应的迭代器,以便next()可以适当地调用它.然后相同的代码应该解决您的问题:

item = next(iter(filter(lambda x: x['name'] == name, items)), None)
Run Code Online (Sandbox Code Playgroud)

请注意,iter()在迭代器上使用仍然可以在Python 3中使用,因此此代码是向前兼容的.


Rak*_*esh 7

尝试使用 iter()

例如:

item = next(iter(filter(lambda x: x['name'] == name, items)), None)
Run Code Online (Sandbox Code Playgroud)