Итерации по словарю python - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь написать тест для функции и создать поддельный словарь для использования в тесте - однако я не могу понять, каким должен быть формат словаря, чтобы он работал в функции. Функция выглядит так:

...

for data in form.cleaned_data["flows"]:
    data_point = property.MeterPoint.objects.get(id=data["id"])

Я думал, что словарь должен быть в следующем формате:

form.cleaned_data = {'flows': {"id": "1234"}}

, но я продолжаю получать эту ошибку при запуске теста:

    id=data["id"]
E   TypeError: string indices must be integers

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Я не уверен, какой фреймворк вы используете, но могу сказать, что если

form.cleaned_data["flow"]

- это словарь, который вы определили как

{"id": "1234"}

, тогда ваша переменная данных имеет тип str (строка). Потому что цикл по словарю - это цикл по ключам словаря. Если вы хотите увеличить l oop значения, вы можете использовать метод .values(), например

for data in my_dict.values():
    print(data)

Если вы используете .values(), тогда ваши данные будут иметь тип str (строка) и иметь значение of "1234".

Более того, вы можете использовать oop над кортежем (парой) элементов ключ-значение. для этого вы можете использовать метод .items(). например,

for key, value in my_dict.items():
    print(key, value)
  • Примечание о распаковке кортежа: если у вас есть кортеж, такой как t = (1, 2, 3), вы можете присвоить его трем переменным как a, b, c = t. При этом у вас есть a = 1, b = 2, c = 3.

Некоторое примечание об ошибке: ошибка, с которой вы сталкиваетесь, связана с тем, что тип data, вероятно, str, и для доступа к индексу строки вы должны передать значение int (целое), а не строка.

0 голосов
/ 27 мая 2020

При повторении dict вы получаете их ключ, а не их значение. Это означает, что для доступа к значению мы должны использовать переменную [key], которую вы пытались, для доступа к ключу, например, dict, поскольку ключ является строкой, python предполагал, что вы пытались получить доступ к символу строки, но это можно сделать только с int.

for key in form.cleaned_data["flows"]:
    data_point = property.MeterPoint.objects.get(id=form.cleaned_data["flows"][key]["id"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...