python-3.x - 在python 3中返回带有列表值的字典
问题描述
我的任务是将一些代码从 python 2.7 更新到 python 3.6
目前代码中断:
TypeError:“地图”对象不可下标
原始代码:
def test_create_page(self):
"""Ensure we can make a page"""
response = DispatchTestHelpers.create_page(self.client)
id = response.data['id']
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
try:
page = Page.objects.get(pk=response.data['id'])
except Page.DoesNotExist:
self.fail('The page should exist in the database')
print()
print()
print(response.data)
print()
print()
# Check Data
self.assertEqual(response.data['title'], 'Test Page')
self.assertEqual(response.data['slug'], 'test-page')
self.assertEqual(response.data['snippet'], 'This is a test snippet')
self.assertEqual(response.data['content'][0]['type'], 'paragraph')
self.assertEqual(response.data['content'][0]['data'], 'This is some paragraph text')
原始输出:
======================================================================
ERROR: test_create_page (dispatch.tests.test_api_pages.PagesTest)
Ensure we can make a page
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/icenine/code/ubyssey-
dev3/dispatch/dispatch/tests/test_api_pages.py", line 67, in
test_create_page
self.assertEqual(response.data['content'][0]['type'], 'paragraph')
TypeError: 'map' object is not subscriptable
到目前为止,我已经通过将地图对象转换为列表来解决这个问题,但是这会返回一个空列表。据我所知,地图对象在被转换为列表之前没有以任何方式被触及,如此处讨论的https://stackoverflow.com/a/45018536/6448060。
字典从以下函数返回:
@classmethod
def create_page(cls, client, title='Test Page', slug='test-page'):
"""Create dummy page"""
url = reverse('api-pages-list')
data = {
'title': title,
'slug': slug,
'snippet': 'This is a test snippet',
'content': [
{
'type': 'paragraph',
'data': 'This is some paragraph text'
}
]
}
return client.post(url, data, format='json')
尝试的解决方案:
def test_create_page(self):
"""Ensure we can make a page"""
response = DispatchTestHelpers.create_page(self.client)
id = response.data['id']
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
try:
page = Page.objects.get(pk=response.data['id'])
except Page.DoesNotExist:
self.fail('The page should exist in the database')
data_list = list(response.data['content'])
print()
print(response.data)
print()
print(data_list)
print()
# Check Data
self.assertEqual(response.data['title'], 'Test Page')
self.assertEqual(response.data['slug'], 'test-page')
self.assertEqual(response.data['snippet'], 'This is a test snippet')
self.assertEqual(data_list[0]['type'], 'paragraph')
self.assertEqual(data_list[0]['data'], 'This is some paragraph text')
尝试的解决方案输出:
{'id': 1, 'slug': 'test-page', 'title': 'Test Page', 'featured_image': None, 'snippet': 'This is a test snippet', 'content': <map object at 0x7ff15f04e048>, 'published_at': None, 'is_published': False, 'published_version': None, 'current_version': 1, 'latest_version': 1, 'preview_id': '8720814f-a5e8-4892-b592-8cbb4d0d019f', 'template': OrderedDict([('id', 'default'), ('name', 'Default')]), 'template_data': {}, 'seo_keyword': None, 'seo_description': None}
[]
======================================================================
ERROR: test_create_page (dispatch.tests.test_api_pages.PagesTest)
Ensure we can make a page
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/icenine/code/ubyssey-
dev3/dispatch/dispatch/tests/test_api_pages.py", line 77, in
test_create_page
self.assertEqual(data_list[0]['type'], 'paragraph')
IndexError: list index out of range
正如您在第一行中看到的,“内容”键的值是一个地图对象。
如何从返回的字典中访问列表值?
解决方案
所以问题出在与 django 相关的几个模块文件中。有几个函数返回地图类型,一个是用于转换与地图一起返回的 json 数据。我用这样的列表包装了返回的地图
return list(map(<whatever is being mapped>))
现在的问题似乎已经解决了。
推荐阅读
- javascript - 我有选择按钮场景,当我点击时我有“国家”字段,我看到选择选项。我需要点击美国
- excel - 对包含问题和答案的单列进行排序
- peoplesoft - PeopleCode中行、行集的功能
- android - 打开 youtube 链接会出现 activityNotFound Error Android
- kubernetes - Prometheus OR 使用 rate() 时
- android - 如何在 Intent 中发送 Jsoup 文档?
- git - Git Credential Manager OSX 的连接重置错误
- google-visualization - 自定义日历图表
- python - max() 不返回最大数
- c - 程序在 C 中的 if 语句之前关闭