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.yml.ini.py(если в нем нет инициализацииConfig()во избежание рекурсии).cfg
- Файлы в формате
CONFIG_NAME=CONFIG_VALUE - Уже существующие и новые переменные окружения
- Обычные
pythonсловари
Файлы для поиска по умолчанию
-
Все комбинации имени
configconfigurationsettingssettingconfи расширения
.json.yaml.ini.env.cfg -
Выделенные, часто используемые названия
env_file.envconfig.py
Доступ к данным
- Через точку
config.name - Нотация
python dictconfig['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
Бывает необходимо некоторым образом преобразовать
конфиги после импорта из файлов, тогда пригодится функция 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')
Можете также посмотреть
- github Ссылки ниже доступны только с гитхаба (не с pypi.org)
- Примеры использования
- Как запустить тесты
Если после документации остались вопросы, код подробно документирован, можно смело смотреть в исходники и читать docstring
Запланированные обновления
- Поддержка загрузки из базы данных
- Поддержка загрузки с config сервера
- Перевод документации и комментариев на английский
Release files for bestconfig 1.3.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| bestconfig-1.3.6.tar.gz | 15.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| bestconfig-1.3.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 32.4 kB
Release files / bestconfig-1.3.6.tar.gz
| Download URL | bestconfig-1.3.6.tar.gz |
|---|---|
| Size | 15.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
51824c63673dbbf0023745320852a0c4adadf2b3b0ff0599da78d4b233f5c363
|
|
BLAKE2b-256 checksum How to use checksums |
3dc93a9ceba596102ce66d126075b1ff47881da24469fcf1977da2f511adf600
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.10.10
|
Release files / bestconfig-1.3.6-py3-none-any.whl
| Download URL | bestconfig-1.3.6-py3-none-any.whl |
|---|---|
| Size | 16.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
13c7664148316c69170a64c60efc9c47e66139a23dd801c68f0de9d7c73e0daf
|
|
BLAKE2b-256 checksum How to use checksums |
d7ad9b0b0394655ad0c095588abedf233806af21aa17f14335542d83f2d0c732
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.10.10
|