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 сервера
- Перевод документации и комментариев на английский
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| bestconfig-1.3.6.tar.gz | 15.7 kB | Without provenance | Details for bestconfig-1.3.6.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| bestconfig-1.3.6-py3-none-any.whl | Python 3 | none | any | Details for bestconfig-1.3.6-py3-none-any.whl |
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
|
Security for bestconfig 1.3.6
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.