Жестко запрограммированные значения — ужасная идея. Вместо этого используйте configparser для чтения файлов конфигурации .ini.

Жесткое кодирование значений конфигурации в приложениях Python — это весело и весело, пока что-то не сломается. Никто не любит искать и заменять значения в сотнях файлов только из-за небольшого изменения URL-адреса конечной точки API. К счастью, есть способ обойти это — записать конфигурацию приложения в отдельный файл.

Сегодня вы узнаете все о работе с .ini файлами в Python. Я считаю, что они обеспечивают большую гибкость, чем JSON или YAML, но немного хуже, чем файлы конфигурации на основе Python. Почему? Ну, условная логика, для начала.

Далее вы увидите, как установить и использовать библиотеку configparser Python с .ini файлами конфигурации в Python.

Как установить библиотеку ConfigParser Python

Вам понадобится модуль configparser для работы с .ini файлами конфигурации. Он не поставляется с Python, поэтому вам придется его установить. Команда установки различается в зависимости от того, используете ли вы Pip или Anaconda. Вот команда установки для обоих:

Пип:

pip install configparser

Анаконда:

conda install -c conda-forge -y configparser

И это все, что нам нужно, чтобы начать работать с .ini файлами в Python.

Как читать файлы конфигурации .ini с помощью ConfigParser

Я создал новую папку с двумя файлами:

  • app.py — содержит код Python на сегодня.
  • config.ini — содержит данные конфигурации, которые мы не хотим жестко кодировать в сценариях Python.

Что касается содержимого файла .ini, то его лучше всего разбить на разделы. Ниже вы увидите два раздела с одинаковыми ключами и разными значениями. Цель состоит в том, чтобы использовать разные места для сохранения файлов в разных средах. Например, в среде разработки файл будет сохранен на рабочем столе, а в рабочей среде тот же файл будет сохранен во временном каталоге:

[dev]
api_url = https://gorest.co.in/public/v2/users
save_dir = /Users/dradecic/Desktop/users_data
save_file = users.json
[prod]
api_url = https://gorest.co.in/public/v2/users
save_dir = /tmp/users_data
save_file = users.json

Но как вы можете прочитать этот файл в Python? Модуль configparser делает это невероятно простым. Просто создайте новый экземпляр класса ConfigParser и прочитайте файл .ini:

import configparser

config = configparser.ConfigParser()
config.read("config.ini")

Теперь мы поиграем с различными методами, которые вы можете использовать для доступа к разделам или отдельным клавишам.

Например, в приведенном ниже фрагменте показано, как распечатать все разделы файла config.ini:

print(config.sections())

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

print(config["dev"]["api_url"])

Вы также можете использовать метод get() для доступа к отдельным ключам:

print(config.get("dev", "api_url"))

Если вы сомневаетесь, что ключ не существует, или хотите быть особенно осторожным, укажите аргумент fallback при вызове get():

print(config.get("dev", "not_exist", fallback=-1))

Вы также можете перебрать весь раздел и получить доступ к его ключам и значениям:

for key in config["dev"]:
    print(key)

Но теперь самое интересное. Мы разделили файл config.ini на две секции — dev и prod. По умолчанию это не имеет реального значения. Что мы можем сделать, так это проверить, на какой ОС работает Python. Например, если код работает в macOS, мы можем предположить, что это среда разработки:

import platform
env = "dev" if platform.system().lower() == "darwin" else "prod"
print(env)

Теперь мы можем использовать переменную env для доступа к ключам и значениям в правильном разделе. Я запускаю код на Mac, поэтому содержимое раздела dev печатается:

import platform
env = "dev" if platform.system().lower() == "darwin" else "prod"
for key in config[env]:
    print(f"{key} = {config[env][key]}")

И это основы работы с ini файлами в Python. Далее вы увидите, как использовать этот тип файла конфигурации при подключении к удаленным API.

Как использовать модуль ConfigParser в приложениях Python

Теперь мы создадим небольшой скрипт Python, который подключается к удаленному REST API и загружает данные в формате JSON. У нас уже есть URL-адреса и пути в файле config.ini. Создайте новый скрипт Python, и все готово.

Фрагмент кода ниже отправляет запрос GET к конечной точке API и локально сохраняет ответ. Он также создает структуру каталогов, если она не существует:

import json
import platform
import pathlib
import configparser
import requests
env = "dev" if platform.system().lower() == "darwin" else "prod"
config = configparser.ConfigParser()
config.read("config.ini")

def get_users() -> dict:
    r = requests.get(config[env]["api_url"])
    return r.text

def save_users(users: dict) -> None:
    path = pathlib.Path(config[env]["save_dir"])
    if not path.exists():
        path.mkdir()
    with open(f"{config[env]['save_dir']}/{config[env]['save_file']}", "w") as f:
        json.dump(users, f)

if __name__ == "__main__":
    users = get_users()
    save_users(users=users)

Ниже вы увидите содержимое каталога users_data:

И вот как вы можете интегрировать файлы конфигурации ini в свои проекты Python. Далее сделаем краткий обзор.

Сводка файлов конфигурации .ini с ConfigParser в Python

Жесткое кодирование значений в приложениях Python — это всегда ужасная идея. Легко изменить пару вещей в одном файле, но представьте, что у вас их сотни. Гарантировано, что вы пропустите пару мест и создадите головную боль себе и всем, с кем вы работаете.

Сегодня вы узнали, как работать с ini файлами конфигурации в Python. Вся установка настолько проста, насколько это возможно, но это не универсальное решение. Например, вы не можете использовать программную логику в .ini файлах. Этот недостаток легко устраняется с помощью файлов Python для настройки. Оставайтесь с нами, если хотите узнать об этом больше.

Понравилась статья? Станьте участником Medium, чтобы продолжать обучение без ограничений. Я получу часть вашего членского взноса, если вы перейдете по следующей ссылке, без каких-либо дополнительных затрат с вашей стороны.



Рекомендуемые чтения

Оставайся на связи

Первоначально опубликовано на https://betterdatascience.com 19 апреля 2022 г.