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

Uploaded Source

Built Distribution

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

Uploaded Python 3

File details

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

File metadata

  • Download URL: bestconfig-1.3.1.tar.gz
  • Upload date:
  • Size: 16.2 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.1.tar.gz
Algorithm Hash digest
SHA256 fe6b874cd65f619a33116db8087cbb92f9e2bde0ddc96a4f44d06c497b829aea
MD5 632f317c018f4ad2cff142ef5c4c466b
BLAKE2b-256 8a66c1ee0bc878e0baa335c437e1036b69dca784bf1cc6de7038ba00ef03cbef

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bestconfig-1.3.1-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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b440b2207a626d86e508597d0012dbcab41c667efc2b67200c3ffc91c42b4964
MD5 ecdb83ea36e52308511ce51bfa4a9ee0
BLAKE2b-256 851c3fc95591cc56e9a0f14b1f785ead016a13028b2bf01afbef190bb91d11bd

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