Я ищу pythoni c способ определения нескольких связанных констант в одном файле, который будет использоваться в нескольких модулях. Я придумал несколько вариантов, но все они имеют недостатки.
Подход 1 - простые глобальные константы
# file resources/resource_ids.py
FOO_RESOURCE = 'foo'
BAR_RESOURCE = 'bar'
BAZ_RESOURCE = 'baz'
QUX_RESOURCE = 'qux'
# file runtime/bar_handler.py
from resources.resource_ids import BAR_RESOURCE
# ...
def my_code():
value = get_resource(BAR_RESOURCE)
Это простой и универсальный вариант, но у него есть несколько недостатков:
_RESOURCE
должно быть добавлено ко всем именам констант для обеспечения контекста - Проверка имени константы в IDE не отобразит другие значения констант
Подход 2 - enum
# file resources/resource_ids.py
from enum import Enum, unique
@unique
class ResourceIds(Enum):
foo = 'foo'
bar = 'bar'
baz = 'baz'
qux = 'qux'
# file runtime/bar_handler.py
from resources.resource_ids import ResourceIds
# ...
def my_code():
value = get_resource(ResourceIds.bar.value)
Это решает проблемы первого подхода, но обратной стороной этого решения является необходимость использования .value
для получения строкового представления (при условии, что нам нужно строковое значение, а не только согласованное значение перечисления). Невозможность добавления .value
может привести к трудным для отладки проблемам во время выполнения.
Подход 3 - переменные класса
# file resources/resource_ids.py
class ResourceIds:
foo = 'foo'
bar = 'bar'
baz = 'baz'
qux = 'qux'
# file runtime/bar_handler.py
from resources.resource_ids import ResourceIds
# ...
def my_code():
value = get_resource(ResourceIds.bar)
Это мой любимый подход, но он может быть неправильно истолкован - классы созданы для создания экземпляров. И хотя правильность кода не пострадает от использования экземпляра класса вместо самого класса, я бы хотел избежать этой траты.
Другой недостаток этого подхода в том, что значения на самом деле не постоянны. Любой клиент кода потенциально может их изменить.
Можно ли предотвратить создание экземпляра класса? Мне не хватает какого-то идиоматического c способа группировки тесно связанных констант?