Возвращение словаря со значениями списка в Python 3 - PullRequest
0 голосов
/ 08 мая 2018

Мне было поручено обновить код с 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' является объектом карты.

Как я могу получить доступ к значениям списка из возвращенного словаря?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Таким образом, проблема была в нескольких файлах модуля, связанных с django. Было несколько функций, которые возвращали типы карт, одна была для преобразования данных json, которые возвращались с картой. Я обернул возвращенные карты списком примерно так:

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

И проблема пока что решена.

0 голосов
/ 08 мая 2018

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

Полагаю, response.data['content'] не является списком, поэтому попытка доступа к его 0-му элементу не удалась.

'content': <map object at 0x7ff15f04e048>,

Посмотрите документацию для этого map объекта; скорее всего, в документах для библиотеки, которую вы используете для фактического попадания по вашим URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...