Python2.7升级至3.6报错:TypeError: 'map' object is not subscriptable求解决
解决Python 3中
map对象无法下标访问的问题 嘿,这个错误我太熟悉了!问题出在Python 2和Python 3对map()函数的实现差异上:
- 在Python 2里,
map()会直接返回一个列表,所以你可以随便用下标(比如my_map[0])或者键(如果是键值对列表转的字典)去访问元素; - 但到了Python 3,
map()返回的是一个迭代器对象——迭代器是按需生成元素的,不支持下标或者键值访问,这就直接触发了你看到的TypeError: 'map' object is not subscriptable。
结合你的测试代码,我给你两种针对性的修复方案:
方案1:把map对象转成列表/字典(最通用)
如果你的代码里有直接对map结果用下标或者键的操作,最简单的办法就是给map()套个list()或者dict()(看你需要的数据结构)。
比如假设DispatchTestHelpers.create_page里有类似这样的Python 2写法:
# Python 2 代码,返回map生成的键值对 response_data = map(lambda item: (item['key'], item['value']), raw_data) return Response(response_data)
改成Python 3兼容的版本:
# 转成字典,这样response.data就是标准字典,支持键访问 response_data = dict(map(lambda item: (item['key'], item['value']), raw_data)) return Response(response_data)
如果是普通列表的场景,就用list(map(...)),比如:
# Python 2 可行,Python 3 报错 processed_items = map(clean_item, raw_items) first_item = processed_items[0] # 改成Python 3兼容 processed_items = list(map(clean_item, raw_items)) first_item = processed_items[0]
方案2:用next()获取迭代器的单个元素(更高效)
如果你只是需要迭代器的第一个元素,没必要把整个迭代器转成列表,用next()更省内存:
processed_items = map(clean_item, raw_items) # 获取第一个元素 first_item = next(processed_items) # 怕迭代器为空的话,可以加个默认值 first_item = next(processed_items, None)
针对你的测试代码的具体排查点
看你贴的测试代码,错误应该出在response.data['id']这一行——说明response.data是个map对象,而不是字典。你需要去检查DispatchTestHelpers.create_page的实现,找到里面用map构造响应数据的地方,把它转换成字典或者列表,这样就能正常用response.data['id']访问了。
打个比方,如果create_page返回的响应数据是用map生成的键值对序列,转成字典就解决问题了;如果是普通元素的序列,转成列表就行。
总之,核心就是把Python 3里的map迭代器转换成支持下标/键访问的容器(列表、字典)就搞定啦!
内容的提问来源于stack exchange,提问作者Rowan Baker-French
相关产品推荐
相关产品推荐

