Модуль collections
Модуль collections в Python — это стандартная библиотека, которая предоставляет специализированные контейнеры данных с дополнительной функциональностью по сравнению с базовыми типами данных (список, словарь, множество и т.д.). Он часто используется в автоматизации для удобной работы с коллекциями данных.
Основные структуры данных из collections:
namedtuple— Создаёт кортеж с именованными полями. Удобен, когда нужно иметь кортеж с доступом к элементам по имени, а не только по индексу.from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(10, 20) print(p.x) # 10deque— Двунаправленная очередь с быстрыми операциями добавления и удаления с обоих концов (очень эффективна для очередей и стэков).from collections import deque d = deque([1, 2, 3]) d.appendleft(0) d.pop()Counter— Счётчик элементов в итерируемом объекте, удобно для подсчёта повторений.from collections import Counter c = Counter(['a', 'b', 'a', 'c', 'b', 'a']) print(c) # Counter({'a': 3, 'b': 2, 'c': 1})OrderedDict(до Python 3.7 имел смысл, с 3.7 обычный dict уже сохраняет порядок вставки) — Словарь, который сохраняет порядок добавления элементов. Полезен, если важен порядок.from collections import OrderedDict od = OrderedDict() od['one'] = 1 od['two'] = 2defaultdict— Словарь с значениями по умолчанию. При обращении к несуществующему ключу автоматически создаёт значение по заданной функции.from collections import defaultdict dd = defaultdict(int) # по умолчанию 0 dd['a'] += 1 print(dd['a']) # 1
Когда полезен в автоматизации?
Counterдля подсчёта, например, количества успешных/неуспешных тестов.defaultdict— удобен при агрегации данных по ключам (например, группировка логов по типу).deque— для реализации очередей заданий, если нужна эффективная вставка/удаление.namedtuple— для структурирования данных с именованными полями (например, результаты тестов).
Пример 1. Использование Counter для подсчёта результатов тестов
Counter для подсчёта результатов тестовПредставим, что у нас есть список результатов запуска тестов, и мы хотим посчитать, сколько было успешных и неуспешных тестов.
from collections import Counter
def test_results_summary():
    # Имитируем результаты тестов
    test_results = ['passed', 'failed', 'passed', 'skipped', 'failed', 'passed']
    counter = Counter(test_results)
    assert counter['passed'] == 3
    assert counter['failed'] == 2
    assert counter['skipped'] == 1Пример 2. Использование defaultdict для группировки логов по уровню
defaultdict для группировки логов по уровнюfrom collections import defaultdict
def test_group_logs_by_level():
    logs = [
        ('ERROR', 'Null pointer exception'),
        ('INFO', 'Started process'),
        ('ERROR', 'Index out of range'),
        ('DEBUG', 'Variable x = 10'),
        ('INFO', 'Process finished'),
    ]
    grouped_logs = defaultdict(list)
    for level, message in logs:
        grouped_logs[level].append(message)
    assert len(grouped_logs['ERROR']) == 2
    assert len(grouped_logs['INFO']) == 2
    assert len(grouped_logs['DEBUG']) == 1Пример 3. Использование namedtuple для структурирования данных теста
namedtuple для структурирования данных тестаfrom collections import namedtuple
TestCase = namedtuple('TestCase', ['name', 'input_data', 'expected_result'])
def test_using_namedtuple():
    test_case = TestCase(name='Check addition', input_data=(2, 3), expected_result=5)
    result = sum(test_case.input_data)
    assert result == test_case.expected_resultПример 4. Использование deque для очереди задач в тесте
deque для очереди задач в тестеfrom collections import deque
def test_task_queue():
    tasks = deque(['test_login', 'test_logout', 'test_payment'])
    # Выполняем первый тест
    current_task = tasks.popleft()
    assert current_task == 'test_login'
    # Добавим новый тест в очередь
    tasks.append('test_profile')
    assert list(tasks) == ['test_logout', 'test_payment', 'test_profile']Last updated
Was this helpful?