Как использовать list/dict/set comprehensions в Python для автоматизации?

«Как использовать list/dict/set comprehensions в Python для автоматизации?» — вопрос из категории Скриптинг и автоматизация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps я активно использую comprehensions в Python-скриптах для автоматизации, так как они позволяют компактно и эффективно преобразовывать данные, например, при обработке вывода команд или конфигурационных файлов.

Практические примеры из задач автоматизации:

  1. Фильтрация списка IP-адресов из вывода команды:

    # Допустим, у нас сырой вывод с адресами
    raw_output = "192.168.1.1 [OK]n10.0.0.5 [FAIL]n192.168.1.10 [OK]"
    lines = raw_output.split('n')
    
    # Используем list comprehension для фильтрации только рабочих адресов
    healthy_ips = [line.split()[0] for line in lines if "[OK]" in line]
    # Результат: ['192.168.1.1', '192.168.1.10']
  2. Создание словаря конфигурации для сервисов из списка:

    services = ['nginx', 'postgresql', 'redis']
    # Dict comprehension для задания портов по умолчанию
    service_ports = {service: default_port for service, default_port in zip(services, [80, 5432, 6379])}
    # Результат: {'nginx': 80, 'postgresql': 5432, 'redis': 6379}
  3. Обработка и дедупликация списка имен хостов из логов (set comprehension):

    log_entries = ["Host: web-01", "Host: db-01", "Host: web-01", "Host: app-01"]
    unique_hosts = {entry.split(": ")[1] for entry in log_entries}
    # Результат: {'web-01', 'db-01', 'app-01'}

Почему это важно в DevOps:

  • Лаконичность: Позволяет писать меньше кода для стандартных операций преобразования данных.
  • Читаемость (в меру): Для простых преобразований comprehension часто читается легче, чем эквивалентный цикл for с .append(). Однако для сложной логики с множественными условиями лучше использовать обычный цикл для сохранения читаемости.
  • Производительность: Обычно выполняется быстрее, чем аналогичный код с циклами, так как оптимизирован на уровне интерпретатора Python.