Добрый день!
Я не программист, а прикладной админ. Увлекаюсь написанием инструментов: скриптопись, толстые клиенты и т.д.
У меня в коде часто возникает потребность хранения большого количества константных значений. Таких как спецификация, длинны полей, адреса машин, имена файлов и многое другое. Мне нужно хранилище неизменяемых данных, которые задаются раз и навсегда и доступны из любой точки кода. При этом для меня очень важно не возиться с созданием объекта, не знать какой тип объекта я использую, не менять значения. По сути мне нужен доступный конфиг, чтобы уйти от сырых строк (литералов) в коде.
Все перечисленные возможности мне дают статичные классы, в атрибутах которых хранится нужная информация, но погуглив хорошенько этот подход я увидел, что его никто не использует.
Ниже привожу пример того, что использую
Как я это решаю
Создаем статитчный класс и используем его дефолтные параметры как хранилище данных. Объект такого класса никогда не создается, а данные не меняются.
# Класс хранит допустимое время выполнения процессов
# На самом деле класс может быть более на одну тему, например длинны строк какого-нибудь файла для нарезки
class TimeFrames:
FILE_EXCHANGE: int = 30
DATABASE_REQUEST: int = 30
API_CALL: int = 10
MAIL_DELIVERY: int = 180
# Система мониторинга использует эти данные
from ... import TimeFrames
# Some code
if api_call_time > TimeFrames.API_CALL:
alarm()
# Модуль переезда на резерв использует эти данные
from ... import TimeFrames
# Some code
if request_time > TimeFrames.DATABASE_REQUEST:
move_to_dr()
И многие другие системы используют такой подход.
Также я использую эти константы
- Как ключи словаря - dict.fromkeys([DbServers.MAIN_DB, DbServers.DR_DB], '')
- Для подсказки функциям направления работы
- Для хранения простых sql-запросов для проброса в БД
- Для создания именованных пользовальских типов чего угодно - CheckBoxType.GET_JSON, CheckBoxType.I_AM_AGREE и др.
- Многое другое
Почему не Enum, dataclass, что-то еще
Мне ужасно неудобно использовать Enum из-за требований постоянно помнить, что это именно Enum. У него нужно было бы писать TimeFrames.API_CALL.value и постоянно держать в голове эту особенность.
dataclass требует создавать из него объекты, упрощая инициализацию и др. Честно говоря мне dataclass видится как хранилище именно не-констант, а переменных значений, которые можно упаковать в разные экземпляры на лету.
Для хранения и валидации сложных структур я использую JSON и pydantic. Совсем сложные, комплексные данные - в БД.
Мой вопрос: какой механизм лучше всего использовать для хранения и быстрого получения предопределенных данных? Является ли мой подход адекватным и будет ли понятен программисту? Какие неочевидные минусы я упустил из внимания, используя такой подход?
Буду очень благодарен за ссылки на документы, статьи и Ваше личное мнение. Спасибо!