【问题标题】:TypeError: list object is not an iterator [duplicate]TypeError:列表对象不是迭代器[重复]
【发布时间】:2018-11-17 00:55:00
【问题描述】:

我正在尝试在 flask-python 中创建一个简单的 post api,但出现此错误:

TypeError: list object is not an iterator

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

我的功能特别有问题:

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

当我尝试在 postman 上发布内容时,我收到了 logcaterror

[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 -

注意:

第 30 行,是下面一行:

item = next(filter(lambda x: x['name'] == name, items), None)

【问题讨论】:

  • 您似乎在 Python 2 上运行 Python 3 代码。

标签: python flask


【解决方案1】:

尝试使用iter()

例如:

item = next(iter(filter(lambda x: x['name'] == name, items)), None)

【讨论】:

    【解决方案2】:

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

    item = next(iter(filter(lambda x: x['name'] == name, items)), None)
    

    请注意,在迭代器上使用 iter() 在 Python 3 中仍然有效,因此此代码向前兼容。

    【讨论】:

    • 您可以补充一点,在迭代器上使用 iter 也可以,因此代码也与 python 3 兼容。
    • 您也可以使用列表推导来保存过滤器调用: item = next(iter([i for i in items if i['name'] == name], None))跨度>
    猜你喜欢
    • 2015-10-23
    • 2018-11-26
    • 2021-10-27
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多