Одна переменная держит одно значение. Но ответ сервиса — это не одно значение, а набор: заказ с номером, суммой и статусом, а рядом список позиций. Для таких наборов в языке есть два хранилища, и почти вся работа тестировщика — это работа с ними.
Список хранит по порядку и достаётся номером; словарь — по имени поля. Ответ сервиса — словарь со списками внутри.
Список: перечень по порядку
живой пример
статусы = ["NEW", "PAID", "SHIPPED"]
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Квадратные скобки, значения через запятую. Элементы пронумерованы с нуля — это главная ловушка для новичка:
живой пример
статусы = ["NEW", "PAID", "SHIPPED"]
print(статусы[0]) # NEW — первый
print(статусы[1]) # PAID — второй
print(статусы[-1]) # SHIPPED — последний
print(len(статусы)) # 3 — сколько всего
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Отрицательный номер считает с конца: [-1] — последний элемент, и это удобнее,
чем [len(список) - 1].
Добавить и проверить:
живой пример
статусы = ["NEW", "PAID", "SHIPPED"]
статусы.append("DELIVERED") # добавить в конец
print(статусы)
print("PAID" in статусы) # True — есть ли такой
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Если попросить элемент, которого нет, — IndexError: list index out of range.
Ошибка полезная: она означает, что данных меньше, чем вы ожидали, — частая
находка в тестах.
Словарь: значение по имени
живой пример
заказ = {
"id": "ord-042",
"status": "PAID",
"total": 4990,
}
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Фигурные скобки, пары «ключ: значение». Достают по ключу, а не по номеру:
живой пример
заказ = {
"id": "ord-042",
"status": "PAID",
"total": 4990,
}
print(заказ["status"]) # PAID
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Это и есть JSON. Ответ сервиса в формате JSON после разбора превращается в
Python-словарь один в один: те же ключи, те же значения. Поэтому «прочитать поле
из ответа» — это ответ["status"], и ничего больше.
Изменить и добавить:
живой пример
заказ = {
"id": "ord-042",
"status": "PAID",
"total": 4990,
}
заказ["status"] = "SHIPPED" # поменяли
заказ["paid_at"] = "2026-09-12" # добавили новое поле
print(заказ)
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Поле, которого может не быть
Вот здесь ломается больше всего тестов. Обращение к отсутствующему ключу — это ошибка:
живой пример
# ошибка: пример падает намеренно — поля «скидка» в заказе нет
заказ = {
"id": "ord-042",
"status": "PAID",
"total": 4990,
}
print(заказ["скидка"]) # KeyError: 'скидка'
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Тест падает не потому, что нашёл дефект, а потому, что плохо написан. Два безопасных способа:
живой пример
заказ = {
"id": "ord-042",
"status": "PAID",
"total": 4990,
}
if "скидка" in заказ:
print(заказ["скидка"])
print(заказ.get("скидка")) # None, если поля нет
print(заказ.get("скидка", 0)) # 0, если поля нет
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
get() — рабочая лошадка: поле в ответе может быть необязательным, и тест
должен это переживать. Но осторожно: get() прячет отсутствие поля. Если
поле обязано быть по контракту, проверяйте его наличие явно, иначе тест
промолчит о настоящем дефекте.
Вложенность: словари внутри списков внутри словарей
Реальный ответ выглядит примерно так:
живой пример
ответ = {
"id": "ord-042",
"customer": {"id": "cus-01", "name": "Анна"},
"items": [
{"product": "Кофемолка", "qty": 1, "price": 4990},
{"product": "Ланчбокс", "qty": 2, "price": 890},
],
"total": 6770,
}
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Читают его по шагам, слева направо:
живой пример
ответ = {
"id": "ord-042",
"customer": {"id": "cus-01", "name": "Анна"},
"items": [
{"product": "Кофемолка", "qty": 1, "price": 4990},
{"product": "Ланчбокс", "qty": 2, "price": 890},
],
"total": 6770,
}
print(ответ["customer"]["name"]) # Анна
print(ответ["items"][0]["product"]) # Кофемолка
print(ответ["items"][1]["qty"]) # 2
print(len(ответ["items"])) # 2 — сколько позиций
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Каждая скобка — один шаг вглубь. Если запутались, разложите на переменные:
живой пример
ответ = {
"id": "ord-042",
"customer": {"id": "cus-01", "name": "Анна"},
"items": [
{"product": "Кофемолка", "qty": 1, "price": 4990},
{"product": "Ланчбокс", "qty": 2, "price": 890},
],
"total": 6770,
}
покупатель = ответ["customer"]
имя = покупатель["name"]
print(имя)
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Читается хуже одной строки, зато видно, где именно упало, когда упадёт.
Чем список отличается от словаря
Правило простое: список — когда элементы однотипные и важен порядок (позиции заказа, найденные записи); словарь — когда у каждого значения своё имя (поля объекта).
Пример из жизни: выдача списком, а каждый её элемент — словарь:
живой пример
{"items": [ {...}, {...} ], "total": 42}
Запустить
Запуск примеров доступен в платном доступе. Там этот же код выполняется прямо в статье: редактор, запуск и проверка рядом с абзацем. Неделя бесплатно →
Что решать
Банк «Данные»:
Коротко
- Список — перечень по порядку, нумерация с нуля,
[-1]— последний. - Словарь — «имя: значение»; разобранный JSON и есть словарь, поэтому чтение
поля из ответа выглядит как
ответ["status"]. - Отсутствующий ключ роняет тест с
KeyError; безопасно —get()или проверкаin, но обязательное по контракту поле проверяйте явно. - Вложенность читается по шагам:
ответ["items"][0]["product"]. - Список — однотипное и по порядку, словарь — именованные поля.