Работа со списками в ConfigParser Python: индексация, доступ

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для обработки списков в ConfigParser рекомендуется использовать модуль json. json.dumps(list) поможет вам сохранить список, а json.loads(config_value) — прочитать его.

Взгляните на пример:

Python
Скопировать код
import configparser, json

config = configparser.ConfigParser()
config['Example'] = {'numbers': json.dumps([1, 2, 3])}

with open('example.ini', 'w') as f:
    config.write(f)

config.read('example.ini')
numbers = json.loads(config['Example']['numbers'])
Кинга Идем в IT: пошаговый план для смены профессии

Разбиение длинных списков

Списки большого объёма удобнее представлять, разбивая их на несколько строк. Такой подход упрощает чтение конфигурационных файлов, особенно с учётом того, что их размер может быть весьма значительным.

Вот пример:

Python
Скопировать код
import configparser, json

config = configparser.ConfigParser()
config['LongList'] = {
    'many_numbers': json.dumps([
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
        11, 12, 13, 14, 15, 16, 17, 18, 19, 20
    ])
}

with open('longlist.ini', 'w') as f:
    config.write(f)

Универсальные значения по умолчанию

Секция [DEFAULT] предназначена для задачи общих значений, используемых в различных разделах. Эта функция идеально подходит для установки значений по умолчанию для списков.

Пример:

Python
Скопировать код
[DEFAULT]
default_numbers = [1, 2, 3]

Организация списков внутри ConfigParser

Для хранения множества списков наиболее рациональным решением будет создание отдельных секций с уникальными парами ключ-значение. Для получения списка элементов используйте config.items("section_name").

Вот пример:

Python
Скопировать код
import configparser

config = configparser.ConfigParser()
config['Fruits'] = {'apples': 10, 'oranges': 20, 'bananas': 30}
config['Vegetables'] = {'carrots': 15, 'tomatoes': 25}

with open('grocery.ini', 'w') as f:
    config.write(f)

fruits = config.items('Fruits')

Строки, структурированные с помощью разделителей

Для хранения списков можно использовать строки с разделителями. Нужно выбрать разделитель, который не будет встречаться в элементах списка, чтобы они корректно интерпретировались.

Пример:

Python
Скопировать код
config['Settings'] = {
  'colors': 'red|green|blue'
}

colors = config['Settings']['colors'].split('|')

Визуализация

Списки в ConfigParser можно представить в форме ящика с отделениями, где каждое отделение — это отдельный элемент списка:

Markdown
Скопировать код
Отделения ящика (🗄️): ['один', 'два', 'три']

В ConfigParser, где нет встроенной поддержки списков, это будет выглядеть как одно единое отделение:

🗄️ Отделение: Один, Два, Три

Использование разделителей позволяет ConfigParser правильно определить отдельные элементы списка:

Markdown
Скопировать код
🗄️ Улучшенное отделение: Один 🔸 Два 🔸 Три

Здесь каждый символ 🔸 является заменой запятой и помогает отделить записи друг от друга.

Расширенные альтернативы

YAML: Этот удобный и наглядный формат изначально поддерживает списки и сложные структуры данных.

Пользовательский парсер: Если структура настроек все увеличивается в сложности, можно создать собственный парсер, что позволит гибко удовлетворить уникальные требования.

Переменные окружения: В некоторых случаях данные, аналогичные спискам, проще контролировать с использованием переменных окружения, что упрощает процесс разработки.

Полезные материалы

  1. configparser — Парсер файлов конфигурации — Документация Python 3.12.2
  2. python – Списки в ConfigParser – Stack Overflow
  3. Проблема 11536: Неправильно написанные аргументы 2 – Трекер Python
  4. Python 101: Введение в ConfigParser – Mouse Vs Python
  5. 13.2. ConfigParser — Парсер файлов конфигурации — Документация Python 2.7.18
  6. configparser — Работа с файлами конфигурации — PyMOTW 3