【问题标题】:Returning dictionary with list values in python 3在python 3中返回带有列表值的字典
【发布时间】:2018-10-18 18:09:49
【问题描述】:

我的任务是将一些代码从 python 2.7 更新到 python 3.6

目前代码中断:

TypeError: 'map' 对象不可下标

原码:

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

正如您在第一行中看到的,'content' 键的值是一个地图对象。

如何从返回的字典中访问列表值?

【问题讨论】:

  • 发布更多的回溯,以便我们查看失败的行。
  • 对于原始错误还是尝试的解决方案?
  • 我添加了原始错误的回溯
  • 第一个。是response.data['content'] 导致了问题吗? response 到底是什么?是requests 模块响应吗?您可以通过执行 foo = response.data['content'][0] 而不是其他检查来删除示例中的绒毛。 type(response.data) 也会很有趣。在迁移到 3.x 的过程中,您还更新了工具链。无论response 是什么,它的作用都可能有所改变。
  • 您促使我研究响应类型是什么,其中包括一个客户端对象。这似乎来自我的 python 2.7 dist-packages 中的 rest_framework!我认为这可能是问题

标签: python-3.x python-2.7 dictionary


【解决方案1】:

response.data['content'][0]['type']

我认为response.data['content'] 不是一个列表,因此访问其第 0 个元素的尝试失败。

'content': &lt;map object at 0x7ff15f04e048&gt;,

查找该map 对象的文档;它可能在您用来实际访问 URL 的库的文档中。

【讨论】:

    【解决方案2】:

    所以问题出在与 django 相关的几个模块文件中。有几个函数返回地图类型,一个是用于转换与地图一起返回的 json 数据。我用这样的列表包装了返回的地图

    return list(map(<whatever is being mapped>))
    

    现在问题似乎已经解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多