Задать вопрос
1na1
@1na1
Hello, world!

Как хранить константы в python?

Добрый день!

Я не программист, а прикладной админ. Увлекаюсь написанием инструментов: скриптопись, толстые клиенты и т.д.

У меня в коде часто возникает потребность хранения большого количества константных значений. Таких как спецификация, длинны полей, адреса машин, имена файлов и многое другое. Мне нужно хранилище неизменяемых данных, которые задаются раз и навсегда и доступны из любой точки кода. При этом для меня очень важно не возиться с созданием объекта, не знать какой тип объекта я использую, не менять значения. По сути мне нужен доступный конфиг, чтобы уйти от сырых строк (литералов) в коде.

Все перечисленные возможности мне дают статичные классы, в атрибутах которых хранится нужная информация, но погуглив хорошенько этот подход я увидел, что его никто не использует.

Ниже привожу пример того, что использую

Как я это решаю

Создаем статитчный класс и используем его дефолтные параметры как хранилище данных. Объект такого класса никогда не создается, а данные не меняются.

# Класс хранит допустимое время выполнения процессов
# На самом деле класс может быть более на одну тему, например длинны строк какого-нибудь файла для нарезки

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. Совсем сложные, комплексные данные - в БД.

Мой вопрос: какой механизм лучше всего использовать для хранения и быстрого получения предопределенных данных? Является ли мой подход адекватным и будет ли понятен программисту? Какие неочевидные минусы я упустил из внимания, используя такой подход?

Буду очень благодарен за ссылки на документы, статьи и Ваше личное мнение. Спасибо!
  • Вопрос задан
  • 2688 просмотров
Подписаться 1 Простой Комментировать
Решение пользователя Максим Припадчев К ответам на вопрос (4)
Maksim_64
@Maksim_64
Data Analyst
Вот большой гайд о константах, Там в принципе описаны все возможные способы создания констант, а их много. И самое главное, есть раздел Handling Your Constants in a Real-World Project, то что тебе и нужно, а не просто "знакомство". Ресурс в python среде пользуется репутацией, его даже в продвинутых книгах упоминают.
https://realpython.com/python-constants/
Ответ написан