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"
}
Что произошло?
- Класс
Config
просканировал текущую директорию, вплоть до корня проекта - Нашел все указанные в аргументах файлы и те, что в списке по умолчанию
(например
.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
Доступ к данным
- Через точку
config.name
- Нотация
python dict
config['name']
Бросает исключение при отсутствии config.get('name', 'default_value', raise_absent=False)
config.get('name.subname')
если параметр это тоже словарь, к вложенным значениям можно обращаться единым запросом черезget
, вложенность не ограничена- Можно сразу при запросе приводить результат к определенному типу
config = Config() LIMIT = config.int('LIMIT') RATE = config.float('RATE') LOGGER = config.dict('logger') USERNAME = config.str('ADMIN_USERNAME') PRICES = config.list('PRICES')
Эти функции, вернут вам значение соответствующего типа, либо, если преобразование не удалось -None
- По умолчанию, при обращении без указания типа, происходит следующее
- Каждый формат файлов, например
.yaml
уже парсится с учетом типов, такvarname: 123
будет считано как число 123 - Если значение все равно представляет собой строку,
совершается попытка интерпретировать его
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')
Можете также посмотреть
- github Остальные ссылки доступны только с оттуда (не с pypi.org)
- Примеры использования
- Как запустить тесты
Если после документации остались вопросы, код подробно документирован, можно смело смотреть в исходники и читать docstring
Запланированные обновления
- Поддержка загрузки из базы данных
- Поддержка загрузки с config сервера
- Перевод документации и комментариев на английский
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file bestconfig-1.3.3.tar.gz
.
File metadata
- Download URL: bestconfig-1.3.3.tar.gz
- Upload date:
- Size: 16.3 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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 075cd4ec6d71a3150c4e0afad06814231de6d42cbf7c590c36cbe31c54d6a3cb |
|
MD5 | 56085f74650596698646ea05b4a04004 |
|
BLAKE2b-256 | 656c9e779e94c94c3858dd4e2e4eb863601695b541abf140857bdb6638b77858 |
File details
Details for the file bestconfig-1.3.3-py3-none-any.whl
.
File metadata
- Download URL: bestconfig-1.3.3-py3-none-any.whl
- Upload date:
- Size: 16.6 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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0f5593cba58e5c51424b1ac2b9979787c5ae853150e9566d10ace8cd6fd10a9d |
|
MD5 | 68df3bbe07738785f6ed062c6a43674c |
|
BLAKE2b-256 | ee3aaacda1a748c7db3fb4f4ce56b346495597dd90d816267f0488a04789cff8 |