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
    • .yml
    • .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

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

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.5.tar.gz (15.7 kB view details)

Uploaded Source

Built Distribution

bestconfig-1.3.5-py3-none-any.whl (16.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: bestconfig-1.3.5.tar.gz
  • Upload date:
  • Size: 15.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.10

File hashes

Hashes for bestconfig-1.3.5.tar.gz
Algorithm Hash digest
SHA256 d6786be406e37cca9fb9a95a9182b64bfcc3fd06be9ecaebb3260ca7343755cc
MD5 71002bb404c24940f77d5fc377815fdd
BLAKE2b-256 16085e28a204d1184662cb09e6c005f865f3eb7204197b6856f88c7e538df198

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bestconfig-1.3.5-py3-none-any.whl
  • Upload date:
  • Size: 16.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.10

File hashes

Hashes for bestconfig-1.3.5-py3-none-any.whl
Algorithm Hash digest
SHA256 eab6b1a03f6eef2f85edbeff4629fd3496ad59d0885d4bebf53e8fddc21dd9e4
MD5 51ba1ab341f16d9330c0771261a0cebd
BLAKE2b-256 77874395bf128f877080ebdcbb784f4f6545d8e4fe7544fdb18b40091864b50c

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