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.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 сервера
- Перевод документации и комментариев на английский
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bestconfig-1.3.6.tar.gz.
File metadata
- Download URL: bestconfig-1.3.6.tar.gz
- Upload date:
- Size: 15.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51824c63673dbbf0023745320852a0c4adadf2b3b0ff0599da78d4b233f5c363
|
|
| MD5 |
f58f446ec492139ee73a890b9befe3a7
|
|
| BLAKE2b-256 |
3dc93a9ceba596102ce66d126075b1ff47881da24469fcf1977da2f511adf600
|
File details
Details for the file bestconfig-1.3.6-py3-none-any.whl.
File metadata
- Download URL: bestconfig-1.3.6-py3-none-any.whl
- Upload date:
- Size: 16.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13c7664148316c69170a64c60efc9c47e66139a23dd801c68f0de9d7c73e0daf
|
|
| MD5 |
808d75fdde1b9622387becd7542aec7c
|
|
| BLAKE2b-256 |
d7ad9b0b0394655ad0c095588abedf233806af21aa17f14335542d83f2d0c732
|