Skip to main content

Setup your project config easily

Project description

bestconfig

Python модуль для работы с файлами конфигурации проекта

Этот модуль поможет сильно упростить использование конфигурационных файлов, вы предпочитаете хранить константы и настройки в .yaml, .json или в переменных окружения?, Это не важно, bestconfig учитывает множество вариантов и предоставляет очень удобный интерфейс доступа к данным

Installation

pip install bestconfig

A Simple Example

Предположим, у вас такая структура проекта

root/
    app:
      main.py
      myconfig.json
    config.yaml
    .env

app/main.py

from bestconfig import Config

config = Config("myconfig.json")
# На этом вся настройка закончилась
# В аргументах можно передать имена файлов,
# в которых у вас хранятся настройки, если они нестандартные

# Следующие варианты эквивалентны
logger = config.get('logger')
logger = config.logger
logger = config['logger']

mode = config.logger.mode
mode = config.get('logger.mode') # -> DEBUG или None
mode = config['__unknown__'] # raise KeyError
mode = config.get('__unknown__') # return None

Содержимое файлов:

.env

DATABASE_PASSWOD=postgres

config.yaml

HOST: http://localhost
PORT: 5050
logger:
  mode: WARNING

myconfig.json

{
    "VERSION": "1.23.4",
    "BUILD": 5563
}

config.to_dict() покажет следующее:

{
    "logger": {
        "mode": "DEBUG"       
     },
    "VERSION": "1.23.4",
    "BUILD": 5563,                     
    "PORT": 5050,
    "HOST": "http://localhost",
    "DATABASE_PASSWOD": "postgres"
}

Что произошло?

  1. Класс Config просканировал текущую директорию, вплоть до корня проекта
  2. Нашел все указанные в аргументах файлы и те, что в списке по умолчанию (например .env, env_file, config.yaml, configuration.ini и тд)

Какие источники конфигов поддерживаются?

  • Файлы следующих типов:
    • .json
    • .yaml
    • .ini
    • .py (если в нем нет инициализации Config() во избежание рекурсии)
    • .cfg
  • Файлы в формате CONFIG_NAME=CONFIG_VALUE
  • Уже существующие и новые переменные окружения
  • Обычные python словари

Файлы для поиска по умолчанию

  • Все комбинации имени

    config configuration settings setting conf

    и расширения

    .json .yaml .ini .env .cfg

  • Выделенные, часто используемые названия

    • env_file
    • .env
    • config.py

Доступ к данным

  1. Через точку config.name
  2. Нотация python dict config['name'] Бросает исключение при отсутствии
  3. config.get('name', 'default_value', raise_absent=False)
  4. config.get('name.subname') если параметр это тоже словарь, к вложенным значениям можно обращаться единым запросом через get, вложенность не ограничена
  5. Можно сразу при запросе приводить результат к определенному типу
    config = Config()
    
    LIMIT = config.int('LIMIT')
    RATE = config.float('RATE')
    LOGGER = config.dict('logger')
    USERNAME = config.str('ADMIN_USERNAME')
    PRICES = config.list('PRICES')
    
    Эти функции, вернут вам значение соответствующего типа, либо, если преобразование не удалось - None
  6. По умолчанию, при обращении без указания типа, происходит следующее
    1. Каждый формат файлов, например .yaml уже парсится с учетом типов, так varname: 123 будет считано как число 123
    2. Если значение все равно представляет собой строку, совершается попытка интерпретировать его python выражение, так .env файл, содержащий LIST=[1, 2] станет
      l = config.get('LIST')
      isinstance(l, list) # True
      print(l) # [1, 2]
      
      Чтобы избежать такого поведения, используйте
       config.get_raw('key') 
      
      Возвращенное значение не будет обработано, на самом деле, эта функция всего лишь делает config.get(cast=None). За подробностями в исходники ;)

Сохранить новую переменную, можно с помощью set

config.set('pages_limit', 12)
print(config.get('pages_limit')) -> 12

config.set('d', {'a': 'value'})
# config.d.a == 'value'

Чтобы проверить, что нужные переменные окружения или файлы импортировались, используйте config.assert_contains()

config.set('key', 'value')
config.assert_contains('key') # pass
config.assert_contains('key1') # raise KeyError

Бывает необходимо некоторым образом преобразовать конфиги после импорта из файлов, тогда пригодится

from bestconfig import Config

config = Config()

FULL_NAME = f'{config.name} {config.lastname}'

config.update_from_locals()

locals() то есть локальные при вызове этой функции станут доступны config.get('FULL_NAME')

Также иногда бывает удобно, вместо config.set('key', 'value') добавить целый словарь или даже файл во время исполнения

from bestconfig import Config
config = Config(exclude_default=True)

config.insert({
    'name': 'Ivan'
})
config.assert_contains('name')

# Добавить к существующим еще и `other_file.yaml`
config.insert('other_file.yaml')

Можете также посмотреть

Если после документации остались вопросы, код подробно документирован, можно смело смотреть в исходники и читать docstring

Запланированные обновления

  • Поддержка загрузки из базы данных
  • Поддержка загрузки с config сервера
  • Перевод документации и комментариев на английский

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bestconfig-1.3.0.tar.gz (16.1 kB view details)

Uploaded Source

Built Distribution

bestconfig-1.3.0-py3-none-any.whl (16.5 kB view details)

Uploaded Python 3

File details

Details for the file bestconfig-1.3.0.tar.gz.

File metadata

  • Download URL: bestconfig-1.3.0.tar.gz
  • Upload date:
  • Size: 16.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.22.0 setuptools/44.0.0 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.5

File hashes

Hashes for bestconfig-1.3.0.tar.gz
Algorithm Hash digest
SHA256 f2360aa3ed57ee44fedb3fa6ccc03fa3a9fe0453fa12ad0782034e8d3519bbc1
MD5 3942e18fb79d117d01afd836c7302879
BLAKE2b-256 00c03c7847ed47ee8975a34ff908ff0c64496a73ede9cd59bb8a38698334e30e

See more details on using hashes here.

File details

Details for the file bestconfig-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: bestconfig-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 16.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.22.0 setuptools/44.0.0 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.5

File hashes

Hashes for bestconfig-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 339b4999acb6f07102c0071f52f3144bd4f2049d7d7d332197e4ac024f927a69
MD5 af196fa195174da0d5f3e5fe734d9d92
BLAKE2b-256 7a34ddb071e161a22cdd1ff1ac1f6d7efa558deae238babe7ae8c4189b8a5413

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page